std :: vector - 错误:无法删除不是指针的对象

时间:2013-02-10 15:26:40

标签: c++ compiler-errors

也许有人可以帮我理解错误。

我写这段代码:

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>          ]

什么是“无法删除不是指针的对象”? 我不是要删除任何对象。

3 个答案:

答案 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。你甚至需要一个指针,你能不能在堆栈上分配对象?