C++ 返回保存在已删除的动态对象中的字符串

c++ return a string held inside a deleted dynamic object

本文关键字:动态 对象 字符串 删除 返回 保存 存在 C++      更新时间:2023-10-16

免责声明:Java 开发人员学习C++。

当您返回保存在已删除的动态对象中的字符串时会发生什么?

这是一个相当标准的取消排队方法,我想让它在不使用模板化数据的指针的情况下工作,这是我的测试用例中的字符串。

Ubuntu 13.04 上的 g++ 给了我段错误。在最新的OSX上,我的数据已损坏。

是我的代码还是C++?

// remove an object from the front of the queue.
// the test case instantiate T as string. 
// front->data is assigned an static string.
template<class T>
T & SomeQueue<T>::dequeue() {
    if (empty()) throw runtime_error("kaboom");
    T tmp = front->data;
    Node<T> *n = front;
    front = front->next;
    delete n;
    return tmp;
};

正如约翰所说,删除对象的副本很好。它崩溃,因为您返回对局部变量 ( tmp ) 的引用。当函数返回时,此对象不再存在,因此无法使用它。将T & SomeQueue<T>::dequeue更改为T SomeQueue<T>::dequeue以便返回T对象的副本,而不是引用。

(而且,如果您在编译时启用警告,大多数编译器会告诉您此类事情)。

此代码没问题,因为您在删除对象之前复制了字符串。段错误的原因另有原因。

校正:

问题就在这里

template<class T>
T & SomeQueue<T>::dequeue() {

应该是

template<class T>
T SomeQueue<T>::dequeue() {

不要返回对局部变量的引用。局部变量被销毁,这就是给你一个对已被销毁的东西的引用。

该代码很好,段错误的原因是您返回了对局部变量的引用,该变量在函数退出时被销毁。

T tmp = front->data;
Node<T> *n = front;
front = front->next;
delete n;
return tmp; //tmp is a local variable here. You are returning a reference (T&)