c++ - HEAP 错误 指定给 RtlValidateHeap 的地址无效

标签 c++ memory-management struct memory-pool

我有内存问题。我以这种方式使用结构:

包.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);
}

但是现在析构函数在循环的第二次迭代中对同一个结构对象执行了两次。

最佳答案

阅读 descriptionfree :

The behavior is undefined if the value of ptr does not equal a value returned earlier by std::malloc(), std::calloc(), or 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 分配的整个内存块.这包括 data 指向的内存。和 allPackages .

有一个简单的经验法则:调用 free每次调用 malloc 时,只需一次/calloc .同样适用于 delete + newdelete[] + new[] .

关于c++ - HEAP 错误 指定给 RtlValidateHeap 的地址无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33613246/

相关文章:

memory-management - 在 Linux 中模拟设备 - 需要一种在 RAM 中分配资源的方法

linux - 内核必须在上下文切换之间保存什么内存 "state"?

python - CPython 中的 id(obj) 和 ctypes.addressof(obj) 有什么区别

c - 在不使用 malloc 的情况下将固定大小的对象分配给指针(指向结构)

c++ - 无法从类内的其他函数访问同一类的变量

c++ - 为什么会发出两次错误?

c++ - 如何覆盖常规 malloc,以便在内存泄漏打印输出中打印行号

c# - 类成员与结构成员上的 volatile 写入的奇怪行为

c - 如何在 C 中使用结构体?

c++ - 在 MPI 中跟踪全局索引