アイデンティティが私に与えられ、コントロールから外されている機能を実装しました。それは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>
として返す正しい方法は何ですか?
mallocでの割り当てはどうですか? – Yury
代わりに 'malloc'を使うと' free'とマッチしないので同様の警告が出ます。 – Martin