0

いくつかのベクトルを保持するクラスがあります。どのメソッドが最適かはわかりませんが、デストラクタを呼び出すときに、それらをメモリから削除する必要があります。

ヘッダ:

class Test
{
public:
    Test();
    ~Test();

    void AddString(char* text);
    void AddString(string text);

private:
    char * StringToCharPointer(string value);

    vector<char*> *pVector;
}

CPPファイル:

Test::Test()
{
};

Test::~Test()
{
    vector<char*>::iterator i;

    for ( i = pVector->begin() ; i < pVector->end(); i++ )
    {
        delete * i;
    }

    delete pVector;
};

char * Test::StringToCharPointer(string value)
{
    char *pChar = new char[value.length()];
    strcpy(pChar, value.c_str());

    return pChar;
};

Test::AddString(char* text)
{
    pVector->push_back(text);
};

Test::AddString(string text)
{
    pVector->push_back(StringToCharPointer(text));
};

これが私が使用するほとんどすべての方法ですが、何が問題なのですか?

4

4 に答える 4

7

まず、iはベクトルのイテレータであり、ベクトルに格納されているポインタではありません。*iはベクトルに格納されているポインタなので、何かを削除する場合はそれである必要があります。

次に、delete *iが指すオブジェクトに。*iが割り当てられている場合にのみ有効ですnew。ではなくnew[]、mallocではなく、文字列リテラルを指していません。データがどのように割り当てられたかはわからないため、データを正しく解放しているかどうかを判断することはできません。

を使用する必要があるようですstd::vector<std::string>

更新された質問の更新:

ヘッダ:

class Test
{
public:
    Test();
    ~Test();

    void AddString(const string &text);
private:
    vector<string> mVector;
};

CPPファイル:

Test::Test()
{
};

Test::~Test()
{
};

void Test::AddString(const string &text)
{
    mVector.push_back(text);
};
于 2012-07-02T11:27:31.800 に答える
0

破棄コードは問題ないように見えます(ただしdelete *i;、2番目のスニペットで意味していると思いますが、そうでない場合、tiはコンパイルされていません。

ただし、発生しているエラーは、ベクトルに悪いものを入れていることを示しています。このchar*ような破壊コードを使用してベクターに挿入できるのは、によって返されるものだけnew charです。特に、他の文字列( 、)の一部として作成されたリテラル("abc")や文字列を挿入しないでください。strtok(NULL, ":")strchr(str, ':')

于 2012-07-02T11:31:13.520 に答える
0

これは明らかな問題の1つですchar *pChar = new char[value.length()];。あなたはやっていますが、未定義の振る舞いを引き起こしたデストラクタでnew[]やっています。これらのポインタを削除するには、deleteを使用する必要があります。delete[]ただし、またはを使用すると、メモリがどのように割り当てられるかがわからないため、を使用delete[]するとメソッドに問題が発生する可能性があります。最も簡単な方法は、SteveJossepによって提案されたように使用することです。Test::AddString(char* text)textnewnew[]mallocstd::vector<std::string>

于 2012-07-02T12:03:49.223 に答える
0

Steve Jessopstd::vector<std::string>の賢明な言葉を短くするために、を 使用する必要があるようです。

もう少し詳しく説明すると、「メモリ割り当てを小さくしたい」と言いますが、ポインタがわからない場合は間違ったパスにいるように聞こえます。時期尚早の最適化を推測するのが間違っている場合は修正してください(通常、このタイプの質問の経験の浅い開発者の場合)。

于 2012-07-02T12:12:53.480 に答える