c++如何释放内存*char

c++ how to free memory *char?

本文关键字:内存 char 释放 何释放 c++      更新时间:2023-10-16

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

我做错了什么?

test[0]包含一个指向静态字符串"Test1"的指针,该字符串无法释放。使用strcpy复制C字符串。

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 ...
}

由于程序在运行时使用"Test1"answers"Test2"(它们由cout打印),编译器必须将它们保存在某个地方。它通过将它们都放入可执行文件中来实现这一点。

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

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

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

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