首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >1个元素分配的数组的正确unique_ptr声明

1个元素分配的数组的正确unique_ptr声明
EN

Stack Overflow用户
提问于 2018-09-27 06:51:43
回答 2查看 60关注 0票数 1

我需要使用一个API作为项目的一部分,该项目包含一个名为ParamSet的类,其方法定义如下:

代码语言:javascript
复制
void AddString(const std::string &, std::unique_ptr<std::string[]> v, int nValues);

该方法的目的是将字符串数组添加到对象以描述某些参数。例如,ParamSet对象可能需要一个指向nValues字符串数组的"filename“参数。

但是,当我尝试将unique_ptr传递给只包含1个字符串的数组时,除非我以特定的方式定义unique_ptr,否则在调用ParamSet对象的析构函数时,代码会出错。

以下代码在调用Clear()return时导致seg-fault。

代码语言:javascript
复制
ParamSet badparam;
badparam.AddString("filename", unique_ptr<string[]> (new string("test")), 1);
badparam.Clear(); // <------ CAUSES SEG FAULT

但是,下面的代码不会导致seg错误。

代码语言:javascript
复制
ParamSet testparam;
std::unique_ptr<std::string[]> strings(new std::string[0]); // DOH, should be string[1]
strings[0] = std::string("test");
testparam.AddString("filename", std::move(strings), 1);
testparam.Clear(); // <------ NO SEG FAULT

我不明白为什么在调用AddString的代码行中创建unique_ptr会导致seg错误,而在调用的外部创建它却不会。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-27 07:10:58

std::unique_ptr的阵列专门化要求为阵列分配new[],因为它默认使用delete[]来释放阵列。

在第一个示例中,使用new分配单个std::string对象,而不是使用new[]分配一个1元素数组。

在您的第二个示例中,您将分配一个0元素的std::string数组,但是您需要一个1元素的数组。

试着这样做:

代码语言:javascript
复制
std::unique_ptr<std::string[]> strings(new std::string[1]); // <-- NOT 0!
// Or, if you are using C++14:
// auto strings = std::make_unique<string[]>(1);
strings[0] = "test";
testparam.AddString("filename", std::move(strings), 1);

或者:

代码语言:javascript
复制
testparam.AddString("filename", std::unique_ptr<std::string[]>(new std::string[1]{"test"}), 1);
票数 0
EN

Stack Overflow用户

发布于 2018-09-27 07:03:40

问题是,您使用非数组new来分配由unique_ptr<T[]>管理的内存,然后该内存将继续使用数组delete[],从而导致未定义的行为。

语法可以是:

代码语言:javascript
复制
badparam.AddString("filename", std::unique_ptr<std::string[]>(new std::string[1]{"test"}), 1);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52527051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档