【问题标题】:c++ - array of shared_ptrc++ - shared_ptr 数组
【发布时间】:2014-11-29 11:09:26
【问题描述】:

上下文:

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

下面的代码只是一个容易理解的意思。

我希望我的 c++ 代码能够工作。

更新:我想尽可能地坚持 IO 的原始 c'ish 风格:一般请不要使用 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++ 代码以这种方式工作吗? (再说一次,我知道向量)。

【问题讨论】:

  • 使用make_shared&lt;&gt; 而不是malloc()。那是行不通的。
  • @πάνταῥεῖ:make_shared 不允许您指定自定义析构函数,如果您想(ab)使用指针来管理数组,则需要这样做。
  • C 代码也是错误的:sizeof **Doc->my_arr 为 1(单个字符)
  • 正确忽略。编辑

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


【解决方案1】:

如果你坚持使用错误的工具来完成这项工作,那么你会希望每个内部指针也是一个智能指针:

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

【讨论】:

  • 是的,最后矢量是迄今为止最好的解决方案。谢谢 Mike
  • 我知道你们中的一些人很难理解,但在某些情况下,您可能不希望 STL 容器的开销。 C++ 通常用于每个内存字节和每个时钟周期都很重要的嵌入式和低功耗环境。所以试着缓和这种居高临下的态度——这没有帮助。
猜你喜欢
  • 2013-06-27
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多