簡體   English   中英

正確刪除char **?

[英]deleting char ** correctly?

我使用以下方法創建了一個二維c字符串數組:

char ** my_array = new char*[N];

然后我使用以下方法初始化每一行:

my_array[i] = new char[M]; // where M is a varying number. assign values to my_array[i] later

所以我幾乎有一個鋸齒狀的2D陣列。

我想繼續並刪除像這樣的整個事情:

for(int i = 0; i < N; i++)
{ delete [] my_array[i]; }

接下來是:

delete [] my_array;

for循環給了我HEAP CORRUPTION ERROR - 為什么?

**************更新 - 完整代碼*********************

#define BOOST_TEST_MODULE ARGS
#define BOOST_LIB_DIAGNOSTIC

#include <string>
#include <vector>
#include <iostream>
#include <boost/test/unit_test.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/assign.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/assign/std/vector.hpp>

using namespace std;
using namespace boost;
using namespace boost::assign;

typedef vector<string> string_array;

BOOST_AUTO_TEST_CASE(test1)
{
    string_array args = list_of
        ("aaa")("bbbb")("ccccccc")("dd")("eeeeeeeee")("ff")("g")("hhh");

    string_array tokens;

    string arg = "";
    for(int i = 0; i < (int)args.size(); i++)
    {
        arg += args[i];
        if(i != (int)args.size() - 1)
                arg += " ";
    }

    split(tokens, arg, is_any_of(" "));

    char ** new_args = NULL;
    new_args = new char*[(int)tokens.size() + 1];
    new_args[(int)tokens.size()] = 0;
    for(int i = 0; i < (int)tokens.size(); i++)
    { 
        new_args[i] = new char[(int)tokens[i].size()];
        for(int j = 0; j <= (int)tokens[i].size(); j++)
        {
            if(j == (int)tokens[i].size())
                new_args[i][j] = '\0';
            else
                new_args[i][j] = tokens[i][j];

        }
    }

    for(int i = 0; i < (int)tokens.size(); i++)
    { 
        std::cout << new_args[i] << std::endl; 
    }

    for(int i = (int)tokens.size() - 1; i >= 0; i--)
        delete new_args[i]; 

    delete [] new_args;
}

如果你沒有安裝boost:將BOOST_AUTO_TEST_CASE轉換為main()和voil'a。

上面做了什么:將一個向量轉換為char **

您的代碼似乎是正確的。 您的堆損壞可能是由其他一些代碼引起的,只有在運行此解除分配代碼時才會檢測到。

您可以通過單獨運行上面的代碼來檢查這一點,而不需要任何其他代碼。 您應該能夠驗證沒有堆損壞。

根據您的開發環境,打開編譯器中的所有內存分配檢查旋鈕,或使用valgrind等工具。

在數組初始化代碼中,為每個'tokens [i]'元素分配'tokens [i] .size()'字符,然后將元素從0初始化為'tokens [i] .size()'。 這顯然是內存溢出。 如果你想要從0到'tokens [i] .size()'的元素,你需要分配一個大小'tokens [i] .size()+ 1'的數組。

您的描述聽起來不錯,但您發布的代碼不完整。 特別是如果你只打電話

my_array[i] = new char[M];

對於數組的某些元素(並非所有N),那么你將在其他元素中有垃圾,這將導致在你看到的刪除循環中檢測到堆損壞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM