C ++ Удалить символ **

Я знаю, что было много вопросов по этому поводу, но я перепробовал все, и НИЧЕГО, кажется, не работает.

я имею 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

Решение

Версия вашего кода, которая может работать, выглядит примерно так:

#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> и просто не беспокойтесь об управлении памятью.

4

Другие решения

Это не удивительно; ты не можешь delete[] то, что вы не сделали new[]!

На самом деле, вся ваша программа имеет неопределенное поведение, потому что ваш char** не инициализирован и никуда не указывает.

Эти элементы, если они были действительными, указывают на строковые литералы, которые снова не могут быть delete[]д.

0