問題描述
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構造對象初始化不熟悉。