【问题标题】:_mm_free as deleter for unique_ptr_mm_free 作为 unique_ptr 的删除器
【发布时间】:2013-12-13 10:00:19
【问题描述】:

这是我在 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);
  }
};

【问题讨论】:

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


    【解决方案1】:

    aligned_delete&lt;A&gt; 是一个函数,而不是一个类型。

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

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

    【讨论】:

      【解决方案2】:

      您的异常处理有点不对劲,如果构造失败,您将泄漏分配的内存。如果_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;
      }
      

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

      【讨论】:

      • 嗨谢谢你的提示。同时我更喜欢让它表现得像new。我还有其他执行 RAII 和异常安全的课程。我将它与unique_ptr 一起使用(make_unique 理想情况下是为了异常安全)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多