在此 C++ 程序中,编程结束时堆损坏的问题是什么?
what is the problem for Heap corruption at the end of programin in this C++ program?
我的简单程序中有一个关于堆损坏的问题,不幸的是我无法理解。程序结束时发生此错误
程序是关于读取特定长度的二进制文件并将其拆分为子包,然后为每个子包初始化适当的解析器并将所有解析器保存在双端队列中
HEAP CORRUPTION DETECTED: after Normal block (#182) at 0x005F2270. CRT
detected that the application wrote to memory after end of heap
buffer.
int main()
{
deque<uint8_t> testData = { 0, 115, 0, 0, 1, 1, 0, 0, 0, 0, 0, 100 };
deque < shared_ptr<IParser>> parsers;
Splitter test(testData, parsers);
test.split();
}
分裂者class
struct Splitter {
const deque<uint8_t>& input;
deque<shared_ptr<IParser>>& parsers;
long x = 0;
Splitter(const deque<uint8_t>& input, deque<shared_ptr<IParser>>& parsers) :input(input), parsers(parsers)
{
}
deque<shared_ptr<IParser>> getParsers();
bool split() {
deque<uint8_t> newVec;
auto headerparser = make_shared<HeaderParser>(newVec);
parsers.push_back(headerparser);
return true;
}
};
IParser class
struct IParser {
const std::deque<uint8_t> input;
IParser(const std::deque<uint8_t> input):input(input){}
};
最后是 HeaderParser
struct HeaderParser :public IParser
{
shared_ptr<Header> output;
HeaderParser(const deque<uint8_t>& input):IParser(input)
{
uint8_t* buff = (uint8_t*)&output;
for (size_t i = 0; i < sizeof(Header); i++)
buff[i] = 0;
}
};
uint8_t* buff = (uint8_t*)&output;
这一行是错误的。您不是将 Header
指针转换为 uint8_t*
,而是整个 shared_ptr
。您覆盖了 shared_ptr
中甚至更远的内存。 shared_ptr
然后尝试删除它自己,但你破坏了它。
你可以使用get()
方法从shared_ptr
中提取对象指针(记得在使用前检查它是否不是nullptr
)。
uint8_t* buff = (uint8_t*)output.get();
我的简单程序中有一个关于堆损坏的问题,不幸的是我无法理解。程序结束时发生此错误
程序是关于读取特定长度的二进制文件并将其拆分为子包,然后为每个子包初始化适当的解析器并将所有解析器保存在双端队列中
HEAP CORRUPTION DETECTED: after Normal block (#182) at 0x005F2270. CRT detected that the application wrote to memory after end of heap buffer.
int main()
{
deque<uint8_t> testData = { 0, 115, 0, 0, 1, 1, 0, 0, 0, 0, 0, 100 };
deque < shared_ptr<IParser>> parsers;
Splitter test(testData, parsers);
test.split();
}
分裂者class
struct Splitter {
const deque<uint8_t>& input;
deque<shared_ptr<IParser>>& parsers;
long x = 0;
Splitter(const deque<uint8_t>& input, deque<shared_ptr<IParser>>& parsers) :input(input), parsers(parsers)
{
}
deque<shared_ptr<IParser>> getParsers();
bool split() {
deque<uint8_t> newVec;
auto headerparser = make_shared<HeaderParser>(newVec);
parsers.push_back(headerparser);
return true;
}
};
IParser class
struct IParser {
const std::deque<uint8_t> input;
IParser(const std::deque<uint8_t> input):input(input){}
};
最后是 HeaderParser
struct HeaderParser :public IParser
{
shared_ptr<Header> output;
HeaderParser(const deque<uint8_t>& input):IParser(input)
{
uint8_t* buff = (uint8_t*)&output;
for (size_t i = 0; i < sizeof(Header); i++)
buff[i] = 0;
}
};
uint8_t* buff = (uint8_t*)&output;
这一行是错误的。您不是将 Header
指针转换为 uint8_t*
,而是整个 shared_ptr
。您覆盖了 shared_ptr
中甚至更远的内存。 shared_ptr
然后尝试删除它自己,但你破坏了它。
你可以使用get()
方法从shared_ptr
中提取对象指针(记得在使用前检查它是否不是nullptr
)。
uint8_t* buff = (uint8_t*)output.get();