je jouais des modèles autour de quand je suis surpris que le code ci-dessous ne fonctionne pas comme prévu:C++: Copier des objets avec memmove et Malloc
#include <iostream>
#include <string>
#include <cstring>
template <class Object>
class CreatorTWO {
public:
CreatorTWO (void) {}
~CreatorTWO (void) throw() {}
template <typename... Object_Params>
Object* create (const Object_Params&... params_) {
Object _temp_obj = Object(params_...);
size_t _obj_bytes = sizeof (_temp_obj);
void * _mem_block = std::malloc (_obj_bytes);
std::memmove(_mem_block,&_temp_obj,_obj_bytes);
//The line below prints the dereferenced object before it is returned:
std::cout << *(static_cast <Object*> (_mem_block)) << '\n';
return static_cast <Object*> (_mem_block);
}
};
int main (int argc, char* argv[]) {
CreatorTWO <std::string> _c2;
std::string* _strp = _c2.create("Hello");
std::cout << *_strp << '\n';
std::free (_strp);
return 0;
}
Le code ci-dessus est censé créer un objet avec nombre variable des paramètres qui lui sont transmis. Cependant, quand j'ai créé une instance avec std :: string, passer un argument de "Hello" devrait me donner un pointeur sur une chaîne contenant "Hello". Cependant, ce n'est pas le cas. Si vous exécutez le code ci-dessus, les valeurs pré et post sont différentes, le pré étant le bon. Est-ce que quelqu'un sait ce qui provoque ce comportement indésirable? Merci.
N'utilisez pas 'malloc()' avec C++. – user0042
Vous ne pouvez pas créer un objet avec 'malloc' ou le déplacer avec' memcpy' (ou des fonctions similaires) sauf si cet objet est un [type POD] (http://en.cppreference.com/w/cpp/concept/PODType) . Pour en savoir plus: https://stackoverflow.com/questions/146452/what-are-pod-types-in-c 'std :: string' n'est définitivement pas un type POD. –
Tout simplement parce que vous avez piraté un allocateur personnalisé, cela ne signifie pas que vous pouvez ignorer l'appel du desturcteur. – StoryTeller