免责声明: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;
};
答案 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&)