gpt4 book ai didi

c++ - 1 元素分配数组的正确 unique_ptr 声明

转载 作者:行者123 更新时间:2023-11-30 04:56:24 24 4
gpt4 key购买 nike

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

void AddString(const std::string &, std::unique_ptr<std::string[]> v, int nValues);

该方法的目的是向对象添加一个字符串数组来描述一些参数。例如,ParamSet 对象可能需要一个指向 nValues 字符串数组的“文件名”参数。

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

以下代码在调用 Clear()return 时会导致段错误。

ParamSet badparam;
badparam.AddString("filename", unique_ptr<string[]> (new string("test")), 1);
badparam.Clear(); // <------ CAUSES SEG FAULT

但是以下不会导致段错误。

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 会导致段错误,但在调用之外创建它却不会。

最佳答案

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

语法可以是:

badparam.AddString("filename", std::unique_ptr<std::string[]>(new std::string[1]{"test"}), 1);

关于c++ - 1 元素分配数组的正确 unique_ptr 声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52527051/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com