可以说我有一个类TwoWayList来保存Records,而GetRec实际上在堆上创建了一个新列表,这是方法

void GetRec(TwoWayList<Record> &rec)
{
   TwoWayList<Record>* list= new TwoWayList<Record>();
   Record r;
   list->Insert(&r);
}


现在我有以下两种情况,第一种在我调用delete时死亡,另一种我只是获得空引用来记录,因此当我调用MoveToStart()时我会遇到段错误,但是如果我删除它就可以了。 ..

int main () {
    TwoWayList<Record> record;
    GetRec(record);
    record.MoveToStart();
    delete &record;//crash
   return 0;
}

int main () {
    TwoWayList<Record> *record;
    GetRec(*record);
    record->MoveToStart(); //segfault
    delete record;
   return 0;
}


那么这是怎么回事?我在方法中的堆中创建了TwoWayList,因此我不应该删除(实际上,如果我不删除它,是否会泄漏?)从我这里的方法中获取TwoWayList的正确方法是什么,以便我这样做以后可以删除吗?

谢谢

丹尼尔

最佳答案

您的第一个main在堆栈上创建记录-而不是堆上。因此,您尝试delete堆栈变量的地址失败。

您的第二个main根本不会分配record。因此,当您尝试使用指针时,它会出现段错误。

同样,您的函数分配内存,但随后将其遗忘并泄漏。我的意思是,您创建一个新的list,但不要握住指针。函数退出后,您将不再有指向创建的列表的指针-可能不是您想要执行的操作。

GetRec也会忽略输入参数-也可能不是您想要的。

猜你在想什么...

void GetRec(TwoWayList<Record> &rec)
{
    Record r;
    rec.Insert(r);
}

int main () {
    TwoWayList<Record> record;
    GetRec(record);
    record.MoveToStart();
    return 0;
}


这将创建一个TwoWayList(命名记录),将记录的引用传递给函数GetRec。 GetRec创建一个记录并将其插入到TwoWayList中。返回main,它在记录中调用MoveToStart(现在已插入一个Record)。

这样可以避免使用堆栈产生新问题或删除问题,将记录插入到TwoWayList中时会以复制记录为代价。令人怀疑的是,该副本的性能成本对您而言是否很重要。但是,如果是这样,那就说吧。

08-16 23:15