vs2013,如下代码,std::shared_ptr<wchar_t> pPath(new wchar_t[size]);跟踪发现销毁的时候是调用的是 delete不是delete [],
virtual void _Destroy() { // destroy managed resource delete _Ptr; }
测试了下delete 和delete[]都能把new的内存块释放掉
while (1) { int size = 1024 * 1024; std::shared_ptr<wchar_t> pPath(new wchar_t[size]); Sleep(0); }
一直运行以上代码内存竟然没有增长。跟踪发现销毁的时候调用的delete代码是
void operator delete( void * p ) { RTCCALLBACK(_RTC_Free_hook, (p, 0)); free( p ); }
这是神马个情况?
解决方案
10
shared_ptr 管理数组需要加自定义删除操作,例如这样,否则导致未定义行为。
std::shared_ptr<int> sp( new int[10], []( int *p ) { delete[] p; } );
主楼里 wchar_t 是内建类型,所以 delete 和 delete[] 看着好像没区别,要是具有析构函数的类型就有区别了。
另外,std 里没有 shared_array。
10
可以本人定义 回收函数
10
没有,不过有提案增加 shared_ptr 对数组的特化,相当于 shared_array 了,处理手法和 unique_ptr 对数组有特化一样。
10
用std::array多好