c ++返回一个被删除的动态对象中的字符串

时间:2013-10-05 07:52:47

标签: c++

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

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

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

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

此代码没问题,因为在删除对象之前复制了字符串。 segfault的原因是另一回​​事。

<强>校正:

问题出在这里

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

应该是

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

不返回对局部变量的引用。本地变量被破坏,这就是给你一个被破坏的东西的引用。

答案 2 :(得分:3)

该代码很好,segfault的原因是你返回一个对函数退出时被破坏的局部变量的引用。

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&)