C++ Valgrind尺寸为8 c和x2B的无效读数+;

C++ Valgrind尺寸为8 c和x2B的无效读数+;,c++,valgrind,C++,Valgrind,Valgrind中的这个错误意味着什么?我看过很多其他帖子,但我仍然不明白错误的真正含义。我的Dragon析构函数有问题吗 ==48500== Invalid read of size 8 ==48500== at 0x40AF66: Dragon::~Dragon() (in /u3/nsah/cs246/1149/a5/cc3k/cc3k/test) ==48500== by 0x40AFDB: Dragon::~Dragon() (in /u3/nsah/cs246/1149/

Valgrind中的这个错误意味着什么?我看过很多其他帖子,但我仍然不明白错误的真正含义。我的Dragon析构函数有问题吗

==48500== Invalid read of size 8
==48500==    at 0x40AF66: Dragon::~Dragon() (in /u3/nsah/cs246/1149/a5/cc3k/cc3k/test)
==48500==    by 0x40AFDB: Dragon::~Dragon() (in /u3/nsah/cs246/1149/a5/cc3k/cc3k/test)
==48500==    by 0x406841: Floor::deleteAll() (in /u3/nsah/cs246/1149/a5/cc3k/cc3k/test)
==48500==    by 0x4022D8: Floor::~Floor() (in /u3/nsah/cs246/1149/a5/cc3k/cc3k/test)
==48500==    by 0x401EE1: main (in /u3/nsah/cs246/1149/a5/cc3k/cc3k/test)
==48500==  Address 0x5a1d130 is 0 bytes inside a block of size 40 free'd
==48500==    at 0x4C2A4BC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==48500==    by 0x40A7B3: Treasure::~Treasure() (in /u3/nsah/cs246/1149/a5/cc3k/cc3k/test)
==48500==    by 0x40671B: Floor::deleteAll() (in /u3/nsah/cs246/1149/a5/cc3k/cc3k/test)
==48500==    by 0x4022D8: Floor::~Floor() (in /u3/nsah/cs246/1149/a5/cc3k/cc3k/test)
==48500==    by 0x401EE1: main (in /u3/nsah/cs246/1149/a5/cc3k/cc3k/test)
编辑: 这就是我的龙课的样子:

#include "dragon.h"
#include <iostream>
#include <cmath>
#include <cstdlib>

using namespace std;

Dragon::Dragon(Item *hoard) {
    // initalizes some variables
    treasureHoard = hoard;
}

Dragon::~Dragon(){
    treasureHoard->deadDragon();
}

// some functions
#包括“dragon.h”
#包括
#包括
#包括
使用名称空间std;
龙:龙(物品*贮藏){
//初始化一些变量
宝藏=贮藏;
}
龙::~Dragon(){
宝库囤积->死龙();
}
//一些功能
编辑: 基本上,我的代码是这样做的:

D *ptr=new D();
// some code …
if (ptr->isDead()) {
    delete ptr;
    ptr = NULL;
}
// some code

// at the end of the program: 
if (ptr) {   // <<< is this causing the error?
    delete ptr;
    ptr = NULL;
}
D*ptr=newd();
//一些代码…
如果(ptr->isDead()){
删除ptr;
ptr=NULL;
}
//一些代码
//课程结束时:

如果(ptr){/我认为
valgrind
的信息非常清楚:

==48500==  Address 0x5a1d130 is 0 bytes inside a block of size 40 free'd

有一块数据“自由”(在C++中最有可能是“全部删除”),并且仍然在被访问。更确切地说,在开始读取大小为40的内存块的开始时,有8字节的单词正在被读取。 也就是说,你的代码实际上在道德上等同于:

T* ptr = new T; // allocator memory of an object of size 40
...
delete ptr;           // release the memory
...
X value = ptr->start; // read the first word of the data
(很明显,类型、成员和变量名在代码中是不同的,但事实大致如此)

下面是一个复制问题的完整程序(尽管堆栈更简单):


显示Dragon类的代码。您正在读取未初始化的内存。一旦我删除指针,您可以按照链接中提到的步骤操作。在结束程序之前,我只需检查它是否存在。您是否认为是导致错误的原因?我非常确定,我在任何其他时间都不会尝试访问删除的指针。(编辑我的主要问题)虽然读取指针本身是一种未定义的行为(一旦删除指针,您只能将其分配给持有该值的指针),但我怀疑读取指针是否是valgrind报告的内容。可能有人正在读取指针指向的值。查看代码和堆栈跟踪,我猜您销毁的对象已被删除。
struct foo {
    double values[5];
};

int main()
{
    foo* ptr = new foo();
    delete ptr;
    double x = ptr->values[0];
    return x;
}