私は期待通りに以下のコードが動作しないことに驚きましたとき、私は、テンプレートの周りに遊んでいた: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が正しいものになります。誰もがこの望ましくない動作の原因を知っていますか?ありがとう。
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