TList > 不会从 src 指向结构的指针"delete src"返回



My Environment:

C++ Builder XE4

我试图使用TList来存储结构体数据。以下是我的示例代码:

struct data_t {
    int key;
    String name;
};
TList *list;

void __fastcall TForm1::addButtonClick(TObject *Sender)
{
    // add records
    list = new TList();
    data_t *dataArray = new data_t[2];
    dataArray[0].key = 31415;
    dataArray[0].name = L"pi";
    list->Add(&dataArray[0]);
    dataArray[1].key = 27182;
    dataArray[1].name = L"napier";
    list->Add(&dataArray[1]);
    ShowMessage(L"added");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::showButtonClick(TObject *Sender)
{
    // get records
    data_t *src;
    for(int idx=0; idx < list->Count; idx++) {
        src = (data_t*)list->Items[idx];
        String msg;
        msg = L"key:" + IntToStr(src->key) + " name:" + src->name;
        ShowMessage(msg);
    }
    // free
    for(int idx=0; idx < list->Count; idx++) {
        src = (data_t*)list->Items[idx];
        delete src; // will not return
    }
    delete list;
    list = NULL;
}
//--------------------------------------------------------------------------

上面代码的问题是代码在delete src中不会返回。

如果没有delete src,代码执行到最后,但是我认为我应该删除带有delete src的data_t赋值。

我想知道解决这个问题的方法,或者我犯的一些错误。

您存储在TList中的指针没有单独与new分配,因此不要尝试单独delete它们。您需要将delete[]替换为您用new[]分配的原始数组:

struct data_t {
    int key;
    String name;
};
TList *list = NULL;
data_t *dataArray = NULL;
void __fastcall TForm1::addButtonClick(TObject *Sender)
{
    // add records
    list = new TList();
    dataArray = new data_t[2];
    dataArray[0].key = 31415;
    dataArray[0].name = L"pi";
    list->Add(&dataArray[0]);
    dataArray[1].key = 27182;
    dataArray[1].name = L"napier";
    list->Add(&dataArray[1]);
    ShowMessage(L"added");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::showButtonClick(TObject *Sender)
{
    // get records
    data_t *src;
    for(int idx=0; idx < list->Count; idx++) {
        src = (data_t*)list->Items[idx];
        String msg;
        msg = L"key:" + IntToStr(src->key) + " name:" + src->name;
        ShowMessage(msg);
    }
    // free
    delete list;
    list = NULL;
    delete[] dataArray;
    dataArray = NULL;
}
//--------------------------------------------------------------------------

如果你想delete单个项目,你必须单独new它们:

struct data_t {
    int key;
    String name;
};
TList *list = NULL;
void __fastcall TForm1::addButtonClick(TObject *Sender)
{
    // add records
    list = new TList();
    data_t *item = new data_t;    
    item->key = 31415;
    item->name = L"pi";
    list->Add(item);
    item = new data_t;
    item->key = 27182;
    item->name = L"napier";
    list->Add(item);
    ShowMessage(L"added");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::showButtonClick(TObject *Sender)
{
    // get records
    data_t *src;
    for(int idx=0; idx < list->Count; idx++) {
        src = (data_t*)list->Items[idx];
        String msg;
        msg = L"key:" + IntToStr(src->key) + " name:" + src->name;
        ShowMessage(msg);
    }
    // free
    for(int idx=0; idx < list->Count; idx++) {
        src = (data_t*)list->Items[idx];
        delete src;
    }
    delete list;
    list = NULL;
}
//--------------------------------------------------------------------------

最新更新