-2

如何使用这样的东西释放内存(Visual Studio 2008 - Win32/console):

我只能包括: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将数据复制char数组中之类的东西。您编写的分配仅覆盖指针,从而丢失动态分配的跟踪(即泄漏)。(事实上​​,如果你只想要固定的字符串,你可能根本不需要动态分配,所以只需删除其中带有new和的行delete。)


但是,您真正想要的是 a 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 中的前两行。

如果你这样做,你会得到一个编译器错误,虽然这个错误应该已经存在,它会抱怨你试图将一个字符串文字(“Test1”,“Test2”)分配给一个非常量数组。

这里的问题是编译器保存到可执行文件中的字符串不能被修改。您只是在打印它们,但 data_t 不知道。要解决问题,您应该使用const char *而不是char *

如果您打算修改这些字符串,则需要分配新内存并将字符串复制到其中。

于 2013-02-17T23:33:03.070 回答