如何使用类似的东西释放内存(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];
}
我做错了什么?
答案 0 :(得分:5)
char[]
是一种不完整的类型,不能在new
表达式中使用。您需要实际决定数组大小,例如:
char * p = new char[200];
然后,当你完成时,你可以说delete[] p;
。
您需要strcpy
之类的内容将数据复制到 char
数组中。您编写的分配仅覆盖指针,从而失去对动态分配(即泄漏)的跟踪。 (事实上,如果您只想要固定字符串,则可能根本不需要动态分配,因此只需删除其中包含new
和delete
的行。)
但你真正想要的是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 *
如果您打算修改这些字符串,则需要分配新内存并将字符串复制到其中。