6

STLコンテナに保存したい複雑なオブジェクト(明示的にマロックされた内部データを含む)の「最小限のフレームワーク」(必要なメソッド)とは何<vector>ですか?

私の仮定(複雑なオブジェクトDoitの例)の場合:

#include <vector>
#include <cstring>
using namespace std;
class Doit {
    private:
        char *a;
    public:
        Doit(){a=(char*)malloc(10);}
        ~Doit(){free(a);}
};

int main(){
    vector<Doit> v(10);
}

与える

*** glibc detected *** ./a.out: double free or corruption (fasttop): 0x0804b008 ***
Aborted

とvalgrindで:

malloc/free: 2 allocs, 12 frees, 50 bytes allocated.

アップデート:

このようなオブジェクトの最小メソッドは次のとおりです:(sbi回答に基づく)

class DoIt{
    private:
        char *a;
    public:
        DoIt() { a=new char[10]; }
        ~DoIt() { delete[] a; }
        DoIt(const DoIt& rhs) { a=new char[10]; std::copy(rhs.a,rhs.a+10,a); }
        DoIt& operator=(const DoIt& rhs) { DoIt tmp(rhs); swap(tmp); return *this;}
        void swap(DoIt& rhs) { std::swap(a,rhs.a); }
};

ありがとう、sbi、https: //stackoverflow.com/users/140719/sbi

4

3 に答える 3

10

チャールズがあなたの質問に完全に答えたことに注意してください。

とにかく、三つのルールに従って、デストラクタを持つクラスには、コピーコンストラクタと代入演算子も必要です。

これが私がそれをする方法です:

class Doit {
    private:
        char *a;
    public:
        Doit()                   : a(new char[10]) {}
        ~Doit()                    {delete[] a;}
        DoIt(const DoIt& rhs)    : a(new char[10]) {std::copy(rhs.a,rhs.a+10,a);}
        void swap(DoIt& rhs)       {std::swap(a,rhs.a);}
        DoIt& operator=(DoIt rhs)  {swap(rhs); return *this;}
};
于 2010-03-23T15:33:45.850 に答える
6

使用するすべてのタイプはとである必要がCopyConstructibleありAssignableます。

CopyConstructibleタイプのT場合tは、がaTまたはaのconst T場合、式は元の;T(t)と同等のものを生成する必要があることを意味します。t。〜T()は有効である必要があります(アクセス可能なデストラクタ)。のアドレスをとして指定する必要があります。Tt&tt[const] T*

AssignableTtおよびT値のu場合、式はと同等であり、型であるt = u必要があることを意味します。tuT&

これらの要件はすべて、単純な組み込み型とPOD構造体によって満たされることに注意してください。デストラクタまたはコンストラクタで重要なことを行う場合は、コピーコンストラクタとコピー代入演算子が同等のセマンティクスを保持していることを確認する必要があります。

于 2010-03-23T15:42:55.147 に答える
0

vector必要なのは、オブジェクトが「割り当て可能」であることです。つまり、コピーコンストラクタ、デストラクタ、および割り当て演算子が必要です。これらはすべて、自分で指定しない場合にデフォルトで生成されます。

sbiが言うように、これらの関数の1つが必要な場合は、おそらくすべてが必要です。あなたの場合、ヒープの破損を避けるために、コピーコンストラクタと代入演算子も提供する必要があります。

于 2010-03-23T15:39:22.890 に答える