c ++如何释放内存* char?

时间:2013-02-17 23:11:03

标签: c++ memory char free

如何使用类似的东西释放内存(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];
}

我做错了什么?

3 个答案:

答案 0 :(得分:5)

char[]是一种不完整的类型,不能在new表达式中使用。您需要实际决定数组大小,例如:

char * p = new char[200];

然后,当你完成时,你可以说delete[] p;

您需要strcpy之类的内容将数据复制到 char数组中。您编写的分配仅覆盖指针,从而失去对动态分配(即泄漏)的跟踪。 (事实上​​,如果您只想要固定字符串,则可能根本不需要动态分配,因此只需删除其中包含newdelete的行。)


但你真正想要的是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 ...
}

答案 1 :(得分:5)

test [0]包含指向静态字符串“Test1”的指针,该指针无法解除分配。使用strcpy复制C字符串。

答案 2 :(得分:1)

由于程序在运行时使用“Test1”和“Test2”(它们由cout打印),编译器必须将它们保存在某处。它通过将它们放入可执行文件中来实现。

由于它们已经在您的可执行文件中,因此没有理由分配任何新内存。 所以你可以删除data_t中的前两行。

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

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

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