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[]
,只有delete
你new
,只有free
你malloc/calloc/realloc
。
话虽这么说,如果您可以控制 ProcessCommandLineArgs
的实施,那么 far 优于只传递 std::vector<std::string>
而不是担心内存管理。
这并不奇怪;你不能 delete[]
一些你没有 new[]
!
事实上,您的整个程序都有未定义的行为,因为您的 char**
未初始化并且没有指向任何地方。
那些元素,如果它们是有效的,指向字符串文字,这又不能是 delete[]
d。
我知道对此有很多疑问,但我已经尝试了所有方法,但似乎没有任何效果。
我有 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[]
,只有delete
你new
,只有free
你malloc/calloc/realloc
。
话虽这么说,如果您可以控制 ProcessCommandLineArgs
的实施,那么 far 优于只传递 std::vector<std::string>
而不是担心内存管理。
这并不奇怪;你不能 delete[]
一些你没有 new[]
!
事实上,您的整个程序都有未定义的行为,因为您的 char**
未初始化并且没有指向任何地方。
那些元素,如果它们是有效的,指向字符串文字,这又不能是 delete[]
d。