c ++ - shared_ptr数组

时间:2014-11-29 11:09:26

标签: c++ c multidimensional-array shared-ptr

上下文:

我尝试避免使用矢量并将其替换为智能指针作为练习。 目标是从智能指针中受益,避免内存泄漏而不依赖于向量,因为这就是我现在想要尝试的。

以下代码只是一个容易理解的方法。

我希望我的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 ++代码以这种方式工作的想法? (再次,我知道矢量)。

1 个答案:

答案 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"};