【发布时间】:2020-11-03 21:43:52
【问题描述】:
在这里,我正在创建动态分配的 S 对象数组,我希望它们被 unique_ptr 销毁,这不会发生,我收到此错误
命令被信号 11 终止
这意味着程序访问了我认为不应该访问的内存。
#include <iostream>
#include <memory>
class S{
public:
S(){std::cout<<"Constructor\n";}
~S(){std::cout<<"Destructor\n";}
};
int main() {
S* arr=new S[4];
{
using namespace std;
unique_ptr<S> ptr=unique_ptr<S>(arr);
}
}
【问题讨论】:
-
std::unique_ptr<S>将假定它正在管理单个对象并有效地执行delete arr。由于arr是使用运算符new的数组形式初始化的,因此行为未定义。 -
我建议您不要使用
new或new[]手动分配内存,而是使用make_unique。在这种情况下,您应该只使用auto arr = make_unique<S[]>(4); -
@ErikNouroyan 类似,但 Nikos 的答案是异常安全的,而 KamilCuk 则不是。
标签: c++ smart-pointers unique-ptr