2017-05-03 131 views
-2

我知道有關於此的許多問題,但我已經嘗試了一切,似乎沒有任何工作。C++刪除char **

我有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>

我將不勝感激任何幫助。 如果你想投票下來,那就做吧,但請給我一個答案,因爲我一直在這個問題上徘徊數小時。

謝謝。

+3

你永遠不會爲'argv'分配內存...... – Rakete1111

+1

好的,你在哪裏'new argv'? –

+0

這些函數對char **具有什麼作用?機會是你仍然可以使用'std :: vector'。 –

回答

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[],僅deletenew只有freemalloc/calloc/realloc

話雖這麼說,如果你有以上的ProcessCommandLineArgs實施控制,這將是優於只是通過一個std::vector<std::string>,只是不用擔心內存管理。

+1

您好,先生,我非常尊重。與其他地方不同的是,您爲我提供了完整的示例。你澄清了需要完成的一切。我只需將'strcpy'改爲'strcpy_s',一切都正常工作 我想使用'vector ',但我需要改變大約10個文件才能工作,因爲我有一套我最初設計的程序從主要採取輸入參數。 謝謝。 – Everyone

+1

我真的不能非常感謝你。我有截止日期,這真的讓我很難過。有趣的是,我的程序的其餘部分是x1000倍更復雜的,但是我儘可能地避免了內存管理。再一次非常感謝你。 – Everyone

+0

@所有人,沒問題。指針和手動內存管理可能會變得粗糙,有時候你只需要在正確的方向上進行操作:-) –

0

這並不意外;你不能delete[]東西,你沒有new[]

事實上,您的整個程序都有未定義的行爲,因爲您的char**未初始化並且沒有指向任何位置。

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