1

次のようなクラスがあるとしましょう:

class LolClass {
    LPWSTR* stuff;
    LolClass::LolClass(LPWCHAR lols) {
        stuff = new LPWSTR[100];
        for (int i = 0; i < 100; i++) {
            stuff[i] = new wchar_t[wcslen(lols)+1];
            wcsncpy(stuffs[i], lols, wcslen(lols)+1);
        }
    }
    LolClass::~LolClass() {
        delete[] stuff;
    }
}

だから私が電話したら

LolClass* veryfunny = new LolClass(L"lol!");

それは私を100笑にします、問題は私が電話するときです

delete veryfunny;

ポインター配列は削除されますが、個々の wchar_t は削除されません。wchar_t をループして削除しようとすると、クラッシュし、veryfunny を削除した後でもそれらがまだそこにあるという事実を知っているため、何をすべきかわかりません (私はクラス外のポインターの 1 つを渡すことによってチェックされます)

ありがとう!

4

2 に答える 2

6

電話すれば

LolClass* veryfunny = new LolClass(L"lol!");

その後、最終的に呼び出す必要があります:

delete veryfunny;

ただし、配列の場合は次のものが必要ですdelete[]stuff[i] = new wchar_t[n]; delete [] stuff[i];

コードでは、最初に要素をループし、次にstuff配列自体をループする必要があります。delete[]delete[]stuff

または、単に使用しstd::vector<std::wstring>ます。


更新:私が理解していることから、あなたは実際には を削除することを心配している*veryfunnyのではなく、 の正しいデストラクタを書く方法について心配していますLolClass。デストラクタは、たとえば などのグローバル オブジェクトおよび自動オブジェクトに対しても呼び出されることに注意し{ LolClass x(L"hello"); } /* boom */くださいLolClass。いずれにせよ、クラスを正しく取得する必要があります。

于 2012-08-15T06:32:49.270 に答える
-1

結局、David Schwartz が勝ちます。wchar は、null で終了していないため、自分自身を削除できませんでした。

于 2012-08-15T07:19:48.300 に答える