也许有人可以帮我理解错误。
我写这段代码:
class Text
{
private:
struct paragraph
{
vector<string> lines;
};
vector<shared_ptr<paragraph>> paragraphs;
public:
Text()
{
paragraphs.push_back(shared_ptr<paragraph>(new paragraph()));
}
};
int main()
{
shared_ptr<Text> pText(nullptr);
Text text();
pText.reset(&text);
return 0;
}
当我尝试运行它时 我收到了这个错误:
1>c:\program files\microsoft visual studio 10.0\vc\include\memory(1664): error C2541: 'delete' : cannot delete objects that are not pointers
1> c:\program files\microsoft visual studio 10.0\vc\include\memory(1431) : see reference to function template instantiation 'void std::tr1::shared_ptr<_Ty>::_Resetp<_Ux>(_Ux (__cdecl *))' being compiled
1> with
1> [
1> _Ty=Text,
1> _Ux=Text (void)
1> ]
1> c:\program files\microsoft visual studio 10.0\vc\include\memory(1607) : see reference to function template instantiation 'std::tr1::shared_ptr<_Ty>::shared_ptr<_Ux>(_Ux (__cdecl *))' being compiled
1> with
1> [
1> _Ty=Text,
1> _Ux=Text (void)
1> ]
1> c:\documents and settings\owner\שולחן העבודה\e\class.cpp(29) : see reference to function template instantiation 'void std::tr1::shared_ptr<_Ty>::reset<Text(void)>(_Ux (__cdecl *))' being compiled
1> with
1> [
1> _Ty=Text,
1> _Ux=Text (void)
1> ]
什么是“无法删除不是指针的对象”? 我不是要删除任何对象。
答案 0 :(得分:3)
除了最令人烦恼的解析外,您的代码还包含一个基本缺陷:
您不能将指向堆栈分配对象的指针分配给shared_ptr
。
此代码将导致未定义的行为,这在实践中意味着很多痛苦:
shared_ptr<Text> pText(nullptr);
Text text;
pText.reset(&text);
shared_ptr
会在其生命周期结束时尝试delete &text
。
答案 1 :(得分:2)
行Text text();
没有按照您的想法行事。
它将其解析为名为text
的 function 的声明,它不接受任何参数并返回类型为Text
的值。
这就是您的行pText.reset(&text);
无法编译的原因。
但是,您确实不希望编译该行:您正在将shared_ptr
对象与具有自动存储持续时间的值相关联:shared_ptr
将会消失范围,它将尝试delete
该对象,导致未定义的行为(在这种情况下很可能是崩溃)。
答案 2 :(得分:0)
你应该阅读main
函数。
int main()
{
shared_ptr<Text> pText(new Text);
return 0;
}
你有两个问题。首先,Text text()
被解析为函数声明。其次,您将堆栈变量的地址传递给shared_ptr
,当引用计数达到0时,它将delete
对象。
您还应该考虑是否需要使用shared_ptr
。你会不会与任何其他人分享这个指针,或者你只是想确保它被正确地破坏?在后一种情况下,您可以考虑unique_ptr
。你甚至需要一个指针,你能不能在堆栈上分配对象?