C ++删除char **

时间:2017-05-03 16:49:52

标签: c++ char delete-operator args

我知道有很多关于这方面的问题但是我已经尝试了所有的东西,而且似乎没有任何工作。

我有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>。如果我试图删除这个问题,我将面临失去提问能力的风险,因为这已经有了答案。

2 个答案:

答案 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只有newfree只有malloc/calloc/realloc

话虽如此,如果您可以控制ProcessCommandLineArgs的实施,那么它只会优于传递std::vector<std::string>并且不用担心内存管理

答案 1 :(得分:0)

这不是一个惊喜;你不能delete[]你没有new[]的东西!

事实上,您的整个程序都有未定义的行为,因为您的char**未初始化并且没有指向任何位置。

这些元素如果有效,则指向字符串文字,这也不能是delete[] d。