2017-07-25 4 views
-5

Comme je peux le comprendre, en C++, faire memcpy avec l'objet de classe nécessitera un constructeur de copie personnalisé défini pour rendre les opérations comme memcpy valide. Ai-je tort? Il n'y a pas de méthode de classe virtuelle impliqués ainsi, comme ci-dessous:en C++, instance instance instance memcpy plante toujours

class A { 
public: 
    string name; 
    int32_t score; 
    A(const string &n, const int32_t score): name(n), score(score) {} 
    A() {}; 
    ~A() {}; 
    // define custom copy constructor; 
    A(const A &a) { 
    name = a.name; 
    score = a.score + 90; 
    } 
    A& operator=(const A &a) { 
     name = a.name; 
     score = a.score + 90; 
     return *this; 
    } 
}; 


int main() { 
    cout << "test is running..." << endl; 
    string name = "thisIsAName"; 
    A a(name, 66); 
    A *a1 = new A(); 

    // send to another process 
    produce(&a); 
    // receive from the other process 
    auto *res = consume(); 

    // cast to A 
    if(res->size == sizeof(A)) { 
     memcpy((uint64_t *)a1, (const uint64_t *)res->data, res->size; 
    } else { 
     // Do log error and return 
     return 1; 
    } 

    std::cout << a1->name << "|" << a1->score << std::endl; 
    std::cout << a.name << "|" << a.score << std::endl; 

    cout << "test reached end" << endl; 

    return 0; 
} 

Y at-il une erreur que je fait?

Également si possible s'il vous plaît donner une meilleure compréhension de memcpy en C++ avec l'objet de classe. Merci beaucoup.

++ Merci les gars, je viens de tester à nouveau semble que j'ai mal compris à propos de memcpy et copier constructeur. La raison d'utiliser memcpy pour lancer en classe A après avoir reçu un objet d'un autre processus. Alors, quelle est la meilleure façon de coder dans cette situation? BR. Stefan

+2

Pourquoi ne pas définir un constructeur de copie pour ne pas utiliser 'memcpy'? Vous ne savez pas non plus pourquoi vous lancez un 'A *' sur un 'uint64_t *' – EdChum

+1

C'est tout faux! Vous initialisez 'a' pour pointer vers un * littéral de chaîne * (pas un objet' A' réel). Vous écrasez les données sans tenir compte du constructeur de copie ou de l'affectation de copie. –

+1

Votre code est incomplet et les pièces que vous avez postées sont erronées. S'il vous plaît poster un code réel. –

Répondre

0

Vous avez une meilleure compréhension maintenant, merci les gars. J'ai travaillé pour résoudre mes problèmes. Et oui, POD trivial-vedette garantit memcpy valide. Prévoir de prendre un livre C++ chaque fois que l'occasion se présente, cela pourrait aider beaucoup. Merci!

Je ne sais pas pourquoi je ne peux pas soumettre cela comme réponse !!

C'est la première fois que je pose des questions ici!

Stefan