我玩弄模板的時候,我很驚訝,因爲預計下面的代碼不起作用:C++:複製對象使用的memmove()和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;
}
上面的代碼應該創建具有不同數目的對象的參數傳遞給它。但是,當我創建一個使用std :: string模板的實例時,傳遞一個「Hello」參數應該給我一個指向包含「Hello」的字符串的指針。然而,這種情況並非如此。如果你運行上面的代碼,pre和post的值與pre是正確的不同。有誰知道是什麼原因導致了這種不良行爲?謝謝。
不要在'C++中使用'malloc()'。 – user0042
除非該對象是[POD類型](http://en.cppreference.com/w/cpp/concept/PODType),否則不能用'malloc'創建對象或用'memcpy'(或類似的函數) 。進一步閱讀:https://stackoverflow.com/questions/146452/what-are-pod-types-in-c'std :: string'最明確地不是POD類型。 –
僅僅因爲你破解了一個自定義分配器,並不意味着可以跳過去極化器的調用。 – StoryTeller