2017-03-08 14 views
4

アイデンティティが私に与えられ、コントロールから外されている機能を実装しました。それはstd::shared_ptr<const void>を返します。関数では、任意の量のメモリを割り当て、shared_ptrを通してアクセスを返します。std :: shared_ptrにメモリを割り当てる正しい方法

私のメモリ割り当てはnew unsigned char[123]で行われます。問題は、valgrindが新しいバリアントとdeleteバリアントの使用間の不一致を検出することです。私はnew[](unsigned)を使用してメモリを割り当てていますが、shared_ptrデストラクタはdelete(void*)を使用して割り当てを解除し、割り当てに「不正な」デオロッカを使用するたびにvalgrindは警告します。より実用的な面では

は、私が何を意味するかを表示するには、このテストケースを書いた:

TEST(Example, Test1) 
{ 
    unsigned char* mem = new unsigned char[123]; 
    std::shared_ptr<const void> ptr(mem); 
} 

valgrindのレポートは

==45794== Mismatched free()/delete/delete [] 
==45794== at 0x4C2A64B: operator delete(void*) (vg_replace_malloc.c:576) 
==45794== by 0x40B7B5: _M_release (shared_ptr_base.h:150) 
==45794== by 0x40B7B5: ~__shared_count (shared_ptr_base.h:659) 
==45794== by 0x40B7B5: ~__shared_ptr (shared_ptr_base.h:925) 
==45794== by 0x40B7B5: ~shared_ptr (shared_ptr.h:93) 
==45794== by 0x40B7B5: Example_Test1_Test::TestBody() (test.cc:108) 
==45794== Address 0x5cb6290 is 0 bytes inside a block of size 123 alloc'd 
==45794== at 0x4C29CAF: operator new[](unsigned long) (vg_replace_malloc.c:423) 
==45794== by 0x40B72E: Example_Test1_Test::TestBody() (test.cc:107) 

が、私は可能な場合はvalgrindのフィルタを回避したいと言います。

任意の量のデータを割り当てて、std::shared_ptr<const void>として返す正しい方法は何ですか?

+0

mallocでの割り当てはどうですか? – Yury

+0

代わりに 'malloc'を使うと' free'とマッチしないので同様の警告が出ます。 – Martin

答えて

13

shared_ptr<T>Tポインタを指定した場合は、1つのオブジェクトを作成したとみなし、delete p;ということを意味します。割り当てが実際にarray-newで実行された場合、delete[] p;を実行する適切な削除プログラムを渡す必要があります。あなたが好きな場合は、std::default_deleteを再利用することができます

return static_pointer_cast<const void>(
    std::shared_ptr<unsigned char>(
     new unsigned char[N], 
     std::default_delete<unsigned char[]>())); 

を、C++ 17では

(変換が暗示されているのであなたも、外側のキャストは必要ありません。)shared_ptrは配列をサポートし、そうすることができます

shared_ptr<unsigned char[]>(new unsigned char[N]) 

となり、正しいdeleterを取得してからvoidに変換します。

+0

[デモ](http://melpon.org/wandbox/permlink/24Or4rgU851gtSYx)、[変更されたデモ](http://melpon.org/wandbox/permlink/tzFXH0NyKUPTht5E)。 –

+0

ありがとう、魅力のように動作します – Martin

関連する問題