C++ 删除字符**

C++ Delete char**

本文关键字:字符 删除 C++      更新时间:2023-10-16

我知道有很多关于这个问题的问题,但我已经尝试了一切,似乎没有任何效果。

我有char**,当我尝试删除它时,我被抛出异常。当我不删除它时,函数返回后会引发异常。

我有一个类似于这样的函数:

void function(){
int argc = 5; char** argv;
argv[0] = "...";
argv[1] = "...";
//...
Package package;
package.ProcessCommandLineArgs(argc, argv); // this does NOT delete argv
// THIS FAILS
for(int i=0;i<5;i++) 
delete[] argv[i]; // <--- EXCEPTION HERE
delete[] argv;
}

我什至尝试仅将该功能用于以下功能:

void function(){
int argc = 5; char** argv;
argv[0] = "...";
argv[1] = "...";
//...
// just declare argv and delete it also fails
for(int i=0;i<5;i++) 
delete[] argv[i]; // <--- EXCEPTION HERE
delete[] argv;
}

我不能不使用char**因为我有 4 个类在调用链中使用相同的参数,所以我没有使用vector<string>的选项。

我将不胜感激任何帮助。 如果你想投反对票,那就去做吧,但请给我一个答案,因为我已经磕磕绊绊了几个小时了。

谢谢。

编辑:我明白为什么这被否决了,现在如果我看到它在SO上被问到,我会投反对票。从那以后,我更改了所有程序以将参数转换为std::vector<std::string>。如果我试图删除这个问题,我将面临失去提问能力的风险,因为这已经有了答案。

可能有效的代码版本如下所示:

#define MAX_SIZE 256 // TODO: set to the size you need...
void function(){
int argc = 5;
char** argv = new char*[argc]; // allocate space for the array!
for(int i = 0; i < argc; ++i) {
argv[i] = new char[MAX_SIZE];  // allocate space for the array entry!
}
// TODO: bounds checking!!!
strcpy(argv[0], "...");     // set the string to the "..."
strcpy(argv[1], "...");     // same...

// cleanup
for(int i=0;i<argc;i++) 
delete[] argv[i];
delete[] argv;
}

总之,只delete[]new[]的,只deletenew的,只freemalloc/calloc/realloc的。

话虽如此,如果你可以控制ProcessCommandLineArgs的实现 ,只通过一个std::vector<std::string>而不用担心内存管理会好得多

这并不奇怪; 你不能delete[]你没有new[]的东西!

事实上,你的整个程序都有未定义的行为,因为你的char**是未初始化的,不会指向任何地方。

这些元素(如果有效)指向字符串文本,而字符串文本同样不能delete[]d。