问题描述
error C2541: “delete”: 不能删除不是指针的对象
源自<<C++ Primer>> 练习12.19。出现问题的代码如下:
class StrBlob
{
public:
friend class StrBlobPtr;
using size_type = vector<string>::size_type;
StrBlobPtr begin();
StrBlobPtr end();
// Problem here
StrBlob() :data(make_shared<vector<string>>) {}
size_type size() const { return data->size(); }
bool empty() const { return data->empty(); }
void push_back(const string &s) { data->push_back(s); }
}
正常看代码是很难看出来问题在哪里的,我是检查了好多遍也没有发现问题在哪里。其实问题就在第一个构造函数中的make_shared<vector< string>>,是需要添加括号进行值初始化的:make_shared<vector< string>>()
出于与变量初始化相同的原因,对动态分配的对象进行初始化通常是个好主意。
问题定位
- 主要是有两方面原因:
- VS的编译环境不熟悉,error explain是从底层开始,之前用过的编译器是从顶层开始。
- 对于make_shared构造对象初始化不熟悉。