gpt4 book ai didi

c++ - 复制分配构造函数中的 aligned_alloc 内存块在释放时崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:10:07 25 4
gpt4 key购买 nike

我正在维护一些遗留代码,这些代码在托管对齐指针类中缺少复制赋值构造函数。我添加了一个如下(简化 View ):

#include <iostream>
#include <cstring>
#include <stdlib.h>

template <class T, unsigned AlignB>
class AlignedPtr {
private:
T *mpBlock;
unsigned mBlkSize;
public:
// Size specific Ctor
AlignedPtr(unsigned uNum) :
mpBlock(static_cast<T*> (aligned_alloc(uNum*sizeof(T), AlignB))),
mBlkSize(uNum) {}
// Default, empty Ctor
AlignedPtr(void) : mpBlock(nullptr), mBlkSize(0) {}
// Copy Assignment Ctor
AlignedPtr& operator=(const AlignedPtr& x)
{
T *mpNewBlock(static_cast<T*>(aligned_alloc(x.mBlkSize*sizeof(T), AlignB)));
for (size_t index=0; index < x.mBlkSize; index++) {
mpNewBlock[index] = x.mpBlock[index];
}
free(mpBlock);
mpBlock = mpNewBlock;
mBlkSize = x.mBlkSize;
return *this;
}
// Destroy managed pointer
~AlignedPtr() {
free(mpBlock);
}
};

int main(int argc, char *argv[])
{

AlignedPtr<float, 16> first_ptr;
std::cout << "Pointer Initialized" << std::endl;

first_ptr = AlignedPtr<float, 16>(8);
std::cout << "Pointer Re-initialized" << std::endl;

return 0;
}

我的期望是程序会正常终止,但是当 first_ptr 超出范围(主要终止)时,我看到 AlignedPtr Dtor 失败。我在上面编译时没有进行任何优化:

g++ -std=c++11 -g aligned_alloc_bug.cpp -o aab

在带有 g++ 4.8.2 的 Ubuntu 14.04 上,出现以下运行时错误:

Pointer Initialized
Pointer Re-initialized
*** Error in `./aab': free(): invalid next size (fast): 0x0000000001cf9080 ***
Aborted (core dumped)

有趣的是,当我将 aligned_alloc 替换为 mallocposix_memalign 时,程序正确终止。这是 aligned_alloc 中的错误还是我遗漏了一些基本的东西?

P.S: 1) 我简短地搜索了一个返回 false 的 gcc 错误。 2) 提前确认避免管理原始指针的建议,但对于手头问题的任何帮助,我将不胜感激。

最佳答案

问题是你有两个对象指向同一个内存:匿名对象和赋值运算符完成后的 first_ptr 具有相同的地址。当它们各自的析构函数被调用时......您可能会猜到会发生什么。

关于c++ - 复制分配构造函数中的 aligned_alloc 内存块在释放时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43159030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com