HEAP错误为RtlValidateHeap指定的地址无效
HEAP error Invalid address specified to RtlValidateHeap
我的内存有问题。我是这样使用结构的:
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
的整个内存块。这包括由data
和allPackages
所指向的存储器。
有一个简单的经验法则:每次调用malloc
/calloc
时,都要准确地调用free
一次。同样适用于delete
+new
和delete[]
+new[]
。
allPackages = (long long int*) ((long long int*)ptr + sizeof(long long int));
当你使用一个长整型指针(在我们的例子中,它是ptr),并且你想提高(长整型)字节的大小时,你只需要做ptr++;
但我建议您重写代码,使用3个malloc而不是一个。
相关文章:
- Valgrind 大小为 8 且地址 0x5b7e520 的读取无效,在大小为 16 的块内为 0 字节 free'd
- 应用地址清理器后,免费无效指针消失
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 删除无效地址时C++引发异常
- 无效* 地址的整数* 值
- thread_local静态类在程序退出时在无效地址处销毁
- 是什么原因导致指定为RtlvalidateHeap的无效地址
- 不同类的虚拟函数共享相同的(无效?)内存地址
- 提升 UDP 组播接收器: set_option:请求的地址在其上下文中无效
- 在无效地址上,boost::asio::ip:::address::from_string 没有引发异常
- 地址清理器在静态强制转换无效指针时报告错误
- 在析构函数中使用 delete[]:为 RtlValidateHeap 指定的地址无效
- GDB打印具有虚拟函数类的非弦乐值的静态常量阵列的无效地址
- 访问无效的指针并进行地址
- VirtualProtect和kernel32.dll-试图访问无效地址
- 删除指向派生类的指针时,为RtlValidateHeap指定的地址无效
- 指定给 RtlValidateHeap DLL 的地址无效
- HEAP错误为RtlValidateHeap指定的地址无效
- 使用智能卡签名(C++)时为RtlFreeHeap指定的地址无效
- 在函数中使用delete[]:为RtlValidateHeap指定的地址无效