1

誰かがエラーを理解するのを手伝ってくれるかもしれません。

私はこのコードを書きます:

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

「ポインタではないオブジェクトを削除できない」とはどういう意味ですか?
オブジェクトを削除しようとしているわけではありません。

4

3 に答える 3

3

最も厄介な解析に加えて、コードには根本的な欠陥が含まれています。

スタックに割り当てられたオブジェクトへのポインターを に代入してはなりませんshared_ptr

このコードは、実際には多くの苦痛を意味する未定義の動作を引き起こします。

shared_ptr<Text> pText(nullptr);
Text text;
pText.reset(&text);

shared_ptrdelete &text寿命の終わりにしようとします。

于 2013-02-10T15:30:21.170 に答える
2

ラインText text();はあなたが思っていることをしません。

引数を受け入れず、 type の値を返すという名前の関数の宣言として解析します。textText

pText.reset(&text);これが、行がコンパイルされない理由です。

ただし、実際にはその行をコンパイルする必要はありませんshared_ptr。オブジェクトを自動保存期間を持つ値に関連付けています。 shared_ptrwill がスコープ外に出ると、deleteそのオブジェクトを試行し、未定義の動作が発生します(ほとんどの場合、この場合)。

于 2013-02-10T15:29:02.950 に答える
0

あなたmainの機能は読むべきです。

int main()
{
    shared_ptr<Text> pText(new Text);
    return 0;
}

2 つの問題がありました。まず、Text text()関数宣言として解析されていました。次に、スタック変数のアドレスを に渡しましたshared_ptr。これはdelete、参照カウントが 0 に達したときにオブジェクトになります。

を使用する必要があるかどうかも検討する必要がありますshared_ptr。このポインターを他のボディと共有することはありますか?それとも、単に適切に破棄されることを確認したいだけですか? unique_ptr後者の場合を考えることができます。ポインタがまったく必要ですか。スタックにオブジェクトを割り当てていただけますか?

于 2013-02-10T15:31:19.190 に答える