HEAP错误为RtlValidateHeap指定的地址无效

HEAP error Invalid address specified to RtlValidateHeap

本文关键字:地址 无效 错误 RtlValidateHeap HEAP      更新时间:2023-10-16

我的内存有问题。我是这样使用结构的:

Package.h文件

#pragma once
#include <cstdlib>
struct Package {
    char *data;
    long long int *packageNumber;
    long long int *allPackages;
    Package(const int sizeOfData);
    ~Package();
};

包.cpp

#include "Package.h"
Package::Package(const int sizeOfData) {
    void *ptr = malloc(2 * sizeof(long long int) + sizeOfData * sizeof(char));
    packageNumber = (long long int*) ptr;
    allPackages = (long long int*) ((long long int*)ptr + sizeof(long long int));
    data = (char*)((char*)ptr + 2 * sizeof(long long int));
}
Package::~Package() {
    free(data);
    free(packageNumber);
    free(allPackages);
}

方法:

for (int j = 0; j < this->bufforSize || i * bufforSize + j < allPackages; j++) {
            Package package(this->packageSize);
            this->file->read(package.data, this->packageSize);
            *package.allPackages = allPackages;
            *package.packageNumber = i * this->bufforSize + j;
            this->dataPacked->push_back(package);
        }

在方括号结束后抛出错误:"HEAP[zad2.exe]: Invalid address specified to RtlValidateHeap( 00000056FEFE0000, 00000056FEFF3B20 )"我不知道自己做错了什么。请帮忙,迈克尔。

编辑:现在它正在为循环的第一次迭代工作。帮助我将析构函数更改为:

Package::~Package() {
    free(packageNumber);
}

但现在析构函数在循环的2’nd迭代中对同一结构对象执行了两次。

阅读free:的描述

如果ptr的值不等于std::malloc()、std::calloc()或std::realloc(。

然后看看你的代码,注意我添加的注释。

void *ptr = malloc(2 * sizeof(long long int) + sizeOfData * sizeof(char));
packageNumber = (long long int*) ptr; // you got this from malloc
allPackages = (long long int*) ((long long int*)ptr + sizeof(long long int)); // the value of this pointer is not equal to anything returned by malloc
data = (char*)((char*)ptr + 2 * sizeof(long long int)); // the value of this pointer is not equal to anything returned by malloc either

最后在析构函数中:

free(data); // was not allocated with malloc -> undefined behaviour
free(packageNumber); // was allocated with malloc -> OK
free(allPackages); // was not allocated with malloc -> undefined behaviour

您尝试删除未从malloc获得的指针。这会导致未定义的行为。错误是由于未定义的行为造成的。请注意,free(packageNumber)释放了分配给malloc的整个内存块。这包括由dataallPackages所指向的存储器。

有一个简单的经验法则:每次调用malloc/calloc时,都要准确地调用free一次。同样适用于delete+newdelete[]+new[]

allPackages = (long long int*) ((long long int*)ptr + sizeof(long long int));

当你使用一个长整型指针(在我们的例子中,它是ptr),并且你想提高(长整型)字节的大小时,你只需要做ptr++;

但我建议您重写代码,使用3个malloc而不是一个。