_mm_free作为unique_ptr的删除者

时间:2013-12-13 10:00:20

标签: c++11 compiler-errors sse unique-ptr

这是我在Visual 2013上的代码。 我需要一个新的对齐。 我不能仅因为A CTOR做了一些有用的事情而分配。

知道为什么不编译?

#include <memory>
#include <emmintrin.h>

struct A{
  A():b(0){b++;}
  int b;
};

template<typename T,int alignment>
inline T* aligned_new(){
    try{
        T*ptr = reinterpret_cast<T*>(_mm_malloc(sizeof(T),alignment));
        new (ptr) T;
        return ptr;
    }
    catch (...)
    {
        return nullptr;
    }
}
template<typename T>
inline void aligned_delete(T*ptr){
    _mm_free(ptr);
}


int main(int argc, char * argv[]){
  std::unique_ptr<A, aligned_delete<A>> var(aligned_new<A,16>);
  return 0;
}

溶液

template<typename T>
struct aligned_delete {
  void operator()(T* ptr) const {
    _mm_free(ptr);
  }
};

2 个答案:

答案 0 :(得分:4)

aligned_delete<A>是一个函数,而不是一个类型。

使用重载函数调用运算符创建一个类型:

template<typename T>
struct aligned_delete {
    void operator()(T* ptr) const {
        _mm_free(ptr);
    }
};

答案 1 :(得分:0)

您的异常处理有点过时,如果构造失败,您将泄漏分配的内存。如果_mm_malloc返回nullptr,它也会有未定义的行为。尝试:

template<typename T, std::size_t alignment>
inline T* aligned_new(){
    void* ptr = _mm_malloc(sizeof(T), alignment);
    if (ptr) {
        try {
            return new (ptr) T;
        } catch(...) {
            _mm_free(ptr);
            throw;
        }
    }
    // throw std::bad_alloc();
    return nullptr;
}

(是的,这不是答案 - 这是一个过长的评论。)