Я знаю, что было много вопросов по этому поводу, но я перепробовал все, и НИЧЕГО, кажется, не работает.
я имею 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[]
, только delete
что ты new
и только free
что ты malloc/calloc/realloc
,
При этом, если у вас есть контроль над выполнением ProcessCommandLineArgs
, это было бы далеко превосходит просто передать std::vector<std::string>
и просто не беспокойтесь об управлении памятью.
Это не удивительно; ты не можешь delete[]
то, что вы не сделали new[]
!
На самом деле, вся ваша программа имеет неопределенное поведение, потому что ваш char**
не инициализирован и никуда не указывает.
Эти элементы, если они были действительными, указывают на строковые литералы, которые снова не могут быть delete[]
д.