下面的代码没有击中Assertion

时间:2018-01-20 10:10:50

标签: c++

我正在尝试使用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;
 }

2 个答案:

答案 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;