我知道有很多关于这方面的问题但是我已经尝试了所有的东西,而且似乎没有任何工作。
我有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>
。如果我试图删除这个问题,我将面临失去提问能力的风险,因为这已经有了答案。
答案 0 :(得分:4)
可能有效的代码版本是这样的:
#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[]
,delete
只有new
而free
只有malloc/calloc/realloc
。
话虽如此,如果您可以控制ProcessCommandLineArgs
的实施,那么它只会远优于传递std::vector<std::string>
并且不用担心内存管理
答案 1 :(得分:0)
这不是一个惊喜;你不能delete[]
你没有new[]
的东西!
事实上,您的整个程序都有未定义的行为,因为您的char**
未初始化并且没有指向任何位置。
这些元素如果有效,则指向字符串文字,这也不能是delete[]
d。