SmartPoint 在<C++primer>4th中的一个例子,它抛出核心转储
An example of SmartPoint in <C++primer> 4th ,it throws coredump
这些天我读了C++入门4th。昨晚,我写了关于smartpoint的演示,这是这本书的一个例子。但是当我运行它时,它会抛出核心转储。我用valgrind和gdb工具来调试它,他们说了关于自由函数的错误,也就是说,删除一个点对象两次。所以我阅读了代码并痛苦了关于内存的图表,但是,我找不到错误。
另外,我使用作家的演示来运行,它也犯了同样的错误。有没有人面对这个问题。这是详细代码。
#include <iostream>
using namespace std;
class U_Ptr {
friend class HasPtr;
private:
int *m_pi;
size_t use;
U_Ptr(int *p)
:m_pi(p),use(1)
{
cout << "U_Ptr(int *)" << endl;
}
~U_Ptr()
{
cout << "~U_Ptr():use" << use << endl;
delete m_pi;
}
};
class HasPtr {
public:
HasPtr(int *p, int i)
:ptr(new U_Ptr(p)), val(i)
{
cout << "HasPtr(int *, int)" << endl;
}
HasPtr(const HasPtr& rhs)
:ptr(rhs.ptr), val(rhs.val)
{
cout << "HasPtr(const HasPtr&)" << endl;
++ptr->use;
}
HasPtr& operator=(const HasPtr& rhs)
{
cout << "operator=" << endl;
++rhs.ptr->use;
if (--ptr->use == 0)
delete ptr;
ptr = rhs.ptr;
val = rhs.val;
return *this;
}
~HasPtr()
{
cout << "~HasPtr():" << ptr->use << endl;
if (--ptr->use == 0) {
cout << "ptr->use:0 call ~U_Ptr()" << endl;
delete ptr;
}
}
int *get_ptr() const
{
return ptr->m_pi;
}
int get_int() const
{
return val;
}
void set_ptr(int *p)
{
ptr->m_pi = p;
}
void set_int(int i)
{
val = i;
}
int get_ptr_val() const
{
return *ptr->m_pi;
}
void set_ptr_val(int i) const
{
*ptr->m_pi = i;
}
private:
U_Ptr *ptr;
int val;
};
// here is test demo
int main(void)
{
int obj = 0;
HasPtr ptr1(&obj, 42);
HasPtr ptr2(ptr1);
int *tmp = new int(4);
HasPtr ptr4(tmp, 44);
ptr4 = ptr2;
cout << "-------- change the ptr's value ----------" << endl;
int *pi = new int(42);
HasPtr ptr3(pi, 10);
ptr3.set_ptr_val(0);
return 0;
}
这是导致问题的部分:
int obj = 0;
HasPtr ptr1(&obj, 42);
HasPtr 的析构函数正在删除传递的参数 int obj,它并没有真正在堆中分配,而只是一个局部变量。
要解决此问题,您可以像这样更改代码:
int* obj = new int(0);
HasPtr ptr1(obj, 42);
相关文章:
- 分段故障(堆芯转储)矢量
- Cppcheck生成xml转储文件
- 如何找出GDB的SIGTRAP核心转储的根本原因
- C++映射分割错误(核心转储)
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 浮点异常(核心转储)#694457
- 为什么我的代码给我一个分段/核心转储错误?
- 在 "CodePad" 中执行链表操作时转储的核心(这是一个在线C++编译器)
- 是否有一个windbg命令来检索转储的module_name
- GDB正在调试一个缺少特定调用堆栈的符号表的核心转储
- SmartPoint 在<C++primer>4th中的一个例子,它抛出核心转储
- 对于MySQLDump,添加一个注释,输出每个表转储的行数
- OpenCV:试图创建一个空白图像,但核心已被转储
- 以RAW形式恢复磁盘内容并转储为一个大二进制文件的应用程序
- 每当应用程序崩溃时,为其创建一个转储文件
- 我运行一个程序并遇到分段错误(核心转储),我使用 gdb 进行调试,程序在运行 ui->setupUI() 时崩溃了
- 我试图访问一个c++多态类的虚表,但失败的核心转储,为什么
- C 语言中的另一个核心转储问题
- 使用oracle occi和c++转储1300万行到一个文件