管理対象のAligned Pointerクラスにコピーアサインコンストラクタが存在しないレガシーコードを維持しています。aligned_allocコピーアサインコンストラクタ内のメモリブロックが解放されている間にクラッシュする
#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デストラクタが失敗しました:(簡易ビュー)を次のように私は1つを追加しました。私は、任意の最適化をすることなく、上記のコンパイル :私はと aligned_allocを交換する際に興味深いことに
Pointer Initialized
Pointer Re-initialized
*** Error in `./aab': free(): invalid next size (fast): 0x0000000001cf9080 ***
Aborted (core dumped)
:
g++ -std=c++11 -g aligned_alloc_bug.cpp -o aab
グラムとUbuntuの14.04 ++ 4.8.2で
と次の実行時エラーが発生しますその問題プログラムのmallocまたは posix_memalignが正しく終了します。これは aligned_allocのバグですか、何か基本的なものがありませんか?
P.S:1)偽を返したgccバグを簡単に検索しました。 2)未処理のポインタの管理を避けるようアドバイスすることは事前に認められていますが、手元の問題については助けてください。
3つのルールに従っていますか? –
@Kerrek SB私は、完全なプログラムもカスタムコピーコンストラクタを持っています。 – fsheikh
私はこれは、代入演算子では4バイト境界で読み込んでいますが、メモリは16バイトに割り当てられているため、読み込みは16バイト境界にあると考えられます。 詳細についてはvalgrindを試してみてください。 – AquaAsh