Frage

Mögliches Duplikat:
Was ist die Dreierregel?

Der folgende Code gibt bestenfalls Müll aus oder stürzt ab:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

class C {
public:
    char* s;
    C(char* s_) {
        s=(char *)calloc(strlen(s_)+1,1);
        strcpy(s,s_);
    };
    ~C() {
        free(s);
    };
};

void func(C c) {};

void main() {
    C o="hello";
    printf("hello: %s\n",o.s);  // works ok
    func(o);
    printf("hello: %s\n",o.s);  // outputs garbage
};

Ich frage mich wirklich, warum – das Objekt sollte nicht einmal berührt werden, weil ich es als Wert übergebe ...

War es hilfreich?

Lösung

Alles an Ihrem Code ist in den Augen von C++ schlecht, sorry.Versuche dies

#include <iostream>

class C {
    std::string s;
    C(const std::string& s_) 
    : s(s_){}
};

std::ostream& operator<<(std::ostream& os, const C& c){
    return os << c.s;
}

void func(C& c){
    // do what you need here
}

int main(){
    C c("hello");
    std::cout << c << '\n';
    func(c);
    std::cout << c << std::endl;
    return 0;
}

In diesem Beispiel müssen Sie sich keine Gedanken über die Speicherzuweisung und -zerstörung, Printf-Formatzeichenfolgen oder strcpy machen.Es ist viel robuster.

C mit Klassen (was Sie schreiben) ist kategorisch falsch und ignoriert blind die Funktionen, die erstellt wurden, um die Sprache ohne Mehraufwand sicherer und einfacher zu machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top