【发布时间】: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<>而不是malloc()。那是行不通的。 -
@πάνταῥεῖ:
make_shared不允许您指定自定义析构函数,如果您想(ab)使用指针来管理数组,则需要这样做。 -
C 代码也是错误的:sizeof **Doc->my_arr 为 1(单个字符)
-
正确忽略。编辑
标签: c++ c multidimensional-array shared-ptr