【发布时间】:2015-11-10 00:40:03
【问题描述】:
我的记忆力有问题。我以这种方式使用结构:
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);
}
但是现在析构函数在循环的第二次迭代中对同一个结构对象执行了两次。
【问题讨论】:
-
当您很明显使用 C++ 时,为什么要将此标记为
C。如果这个是 C++,为什么不使用new [ ]和delete[ ]或者只是一个容器,比如std::vector? -
你为什么要给
free打3次电话?只有一个对malloc的呼叫正在完成。 -
因为我必须在连续的内存片段中进行。整个结构必须在一个地方。
-
与使用
new char [ ]或std::vector<char>相比,malloc没有任何魔力。它们基本上都做同样的事情,即以字节为单位分配一块连续的内存。至少与malloc和std::vector<char>不同的是,您不再需要手动管理分配和解除分配,这就是您现在出现错误的原因。 -
@PaulMcKenzie 谢谢,但我想以 C 方式分配内存。例如,分配 n 大小的 char + m 大小 int 数组对我来说看起来更好。
标签: c++ memory-management struct memory-pool