C++ 返回保存在已删除的动态对象中的字符串
c++ return a string held inside a deleted dynamic object
免责声明: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&)
相关文章:
- C++中的动态对象与非动态对象
- 创建动态对象并将其推送到矢量中
- 删除包含包含动态对象的 STL 容器的智能指针
- 将基类分配给派生对象,反之亦然,以C++以及静态和动态对象之间的差异
- C++ - 确定 const char* 是指向字符串文本对象还是动态对象
- C++ 中的动态对象
- 在正确性或良好的代码结构方面,这种动态对象创建看起来如何
- 删除动态对象的错误
- 关于删除动态对象数组
- 使用动态指针数组进行动态对象分配 - 使用什么删除?
- 如何在C++中创建动态对象列表
- C 动态对象类比较
- C++动态对象.如何在运行时确定对象大小?
- 使动态对象数组成为问题
- 动态对象指针数组C++
- 如何从操作员函数返回动态对象
- Qt创建动态对象并为同一信号分配不同的功能
- 如何在成员函数中创建动态对象
- C++ 对动态对象板进行建模
- 了解C++中的动态对象("new")