C++ 删除字符**

C++ Delete char**

我知道对此有很多疑问,但我已经尝试了所有方法,但似乎没有任何效果。

我有 char**,当我尝试删除它时,抛出异常。当我不删除它时,函数returns.

后抛出异常

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

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 的实施,那么 far 优于只传递 std::vector<std::string> 而不是担心内存管理。

这并不奇怪;你不能 delete[] 一些你没有 new[]!

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

那些元素,如果它们是有效的,指向字符串文字,这又不能是 delete[]d。