我正在尝试使用VERIFY。我编写了一个示例代码,其中我已经声明了一个带有指向整数的指针的结构。我将一个结构变量分配给另一个。当主要结束范围时,为两个对象调用析构函数。我在析构函数中编写代码来删除指针并将其指定为null。我观察到另一个结构对象中的指针没有按预期变为null(因为默认的复制构造函数执行浅复制。请帮助。
// DebuggingTools.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "Precompiled.h"
#include <crtdbg.h>
#define ASSERT _ASSERTE
#ifdef _DEBUG
#define VERIFY ASSERT
#else
#define VERIFY(expression) (expression)
#endif
struct Verify
{
int* ptr;
~Verify()
{
VERIFY(DEL(&ptr));
}
bool DEL(int** p)
{
if (*p != NULL)
{
delete *p;
*p = NULL;
return true;
}
else return false;
}
};
auto main() -> int
{
Verify mypoint;
Verify hispoint;
mypoint.ptr = new int(15);
hispoint = mypoint;
}
答案 0 :(得分:0)
问题是你不遵循the rules of three, five or zero,并且显然认为类的不同实例的成员变量是连接的。
这意味着当您使用
复制指针时hispoint = mypoint;
你有两个独立的指针,都指向同一个内存。
当其中一个对象超出范围时,内存将被删除。然后另一个内存超出范围,你试图再次删除相同的内存。
两个指针成员变量是不同的。每个对象有一个不同的成员变量实例,它们不以任何方式相互关联或相互连接。
答案 1 :(得分:0)
每个对象都有自己的int指针。您在一个对象中对nullptr的赋值不会将nullptr分配给另一个对象中的指针。最后你有UB双动态内存释放。 如果要在同一个类的所有对象之间共享指针,请将静态指针声明为int,如
static int* ptr;
并在类之外定义它,如
int* Verify::ptr = nullptr;