我尝试避免使用矢量并将其替换为智能指针作为练习。 目标是从智能指针中受益,避免内存泄漏而不依赖于向量,因为这就是我现在想要尝试的。
以下代码只是一个容易理解的方法。
我希望我的c ++代码能够正常工作。
更新:我想尽可能多地使用原始c'ish风格的IO:请不要使用std :: string或c ++流。
C版(工作):
typedef struct{
char ** my_arr;
} MyInputs;
...
MyInputs *Doc = malloc(sizeof *Doc);
*Doc->my_arr = malloc(sizeof (*Doc->my_arr) * 2);
Doc->my_arr[0] = malloc(10);
Doc->my_arr[1] = malloc(10);
// Yes, that is stupid to alloc 10 bytes and use only 6 or 5. That is for the example.
memcpy(Doc->my_arr[0],(char*)"Hello\0",6);
memcpy(Doc->my_arr[1],(char*)"Cool\0",5);
printf("%s %s \n",Doc->my_arr[0],Doc->my_arr[1] );
...
C ++版本(尝试):
typedef struct {
std::shared_ptr<char*>my_arr;
}MyInputs;
...
std::shared_ptr<MyInputs> MainDoc (static_cast<MyInputs*>(malloc(sizeof (*MainDoc))),free);
std::shared_ptr<char*> Z (static_cast<char**>(malloc(sizeof (**MainDoc->my_arr) * 10)),free);
std::shared_ptr<char> Z[0](static_cast<char*>(malloc(sizeof (char *) * 10)),free);
memcpy(Z[0].get(), (char*)"salut\0", 6);
cout << Z[0] << endl;
...
在c ++版本中,编译器抱怨Z和Z [0]相同,并且cout中的operator []不匹配。 好吧,好吧......
任何可以使c ++代码以这种方式工作的想法? (再次,我知道矢量)。
答案 0 :(得分:4)
如果您坚持使用错误的工具进行工作,那么您希望每个内部指针也是一个智能指针:
shared_ptr<shared_ptr<char>> my_arr;
您不能简单地使用malloc
来创建一系列非平凡类型,例如shared_ptr
;使用new
:
my_arr.reset(new shared_ptr<char>[10], [](shared_ptr<char> * p) {delete [] p;});
然后您可以分配或重置元素。 shared_ptr
不支持[]
,因为它通常不用于数组,因此请使用get()
获取指向第一个元素的指针:
my_arr.get()[0].reset(new char[10], [](char * p) {delete [] p;});
或者只是用明智的东西取代这种乱码
std::vector<std::string> my_arr {"Hello", "Cool"};