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;
}
//--------------------------------------------------------------------------