-2

このようなものでメモリを解放する方法(Visual Studio 2008-Win32 /コンソール):

含めることができるのは:iostream

#include <iostream>

void data_t(char *test[])
{
    test[0] = new char[];
    test[1] = new char[];
    test[0] = "Test1";
    test[1] = "Test2";
}

int main()
{
    char *test[2];
    data_t(test);
    cout<<test[0]<<"\n";
    cout<<test[1]<<"\n";
    delete[] test[0];//Debug assertion failed! - The program '[7884] Zadanie_4_sortowanie.exe: Native' has exited with code 3 (0x3).
    delete[] test[1];
}

私は何を間違えますか?

4

3 に答える 3

5

char[]は不完全な型であり、式で使用することはできませんnew。次のように、実際に配列サイズを決定する必要があります。

char * p = new char[200];

次に、delete[] p;完了したときに言うことができます。

データを配列strcpyにコピーするようなものが必要になります。作成した割り当てはポインタを上書きするだけなので、動的割り当てを追跡できなくなります(つまりリーク)。(実際、固定文字列だけが必要な場合は、動的割り当てはまったく必要ない可能性があるため、文字列内の行を削除するだけです。)charnewdelete


ただし、本当に必要なのは次のstd::array<std::string, 2>とおりです。

#include <array>
#include <string>
#include <iostream>

std::array<std::string, 2> test =  { "Test1", "Test2" };
std::cout << test[0] << "\n" << test[1] << "\n";

または、参照して渡します。

void populate(std::array<std::string, 2> & a)
{
    a[0] = "Test1";
    a[1] = "Test2";
}

int main()
{
    std::array<std::string, 2> test;
    populate(test);
    // print ...
}
于 2013-02-17T23:12:22.010 に答える
5

test[0] には、割り当てを解除できない静的文字列 "Test1" へのポインターが含まれています。strcpy を使用して C 文字列をコピーします。

于 2013-02-17T23:13:31.040 に答える
1

"Test1" と "Test2" は実行時にプログラムによって使用されるため (cout によって出力されます)、コンパイラはそれらをどこかに保存する必要があります。これは、両方を実行可能ファイルに入れることによって行われます。

どちらも既に実行可能ファイルに含まれているため、新しいメモリを割り当てる必要はありません。したがって、data_t の最初の 2 行を削除できます。

これを行うと、コンパイラ エラーが発生しますが、このエラーは既に発生しているはずであり、文字列リテラル ("Test1"、"Test2") を const 以外の配列に割り当てようとしているというエラーが表示されます。

ここでの問題は、コンパイラによって実行可能ファイルに保存された文字列が変更されないことです。あなたはそれらを印刷しているだけですが、data_tはそれを知りません。問題を解決するには、const char *代わりに使用する必要がありますchar *

これらの文字列を変更する場合は、新しいメモリを割り当てて文字列をそこにコピーする必要があります。

于 2013-02-17T23:33:03.070 に答える