如何将其切换到 unique_ptr?

Posted

技术标签:

【中文标题】如何将其切换到 unique_ptr?【英文标题】:How do I switch this to unique_ptr? 【发布时间】:2018-08-25 07:09:46 【问题描述】:

如何做到这一点,这样我就不必手动删除指针?

unique_ptrvector<> 中?

这是我的代码:

class vec2 
 public:
  double x;
  double y;

  vec2() 
    x = 0.0;
    y = 0.0;
  

  vec2(double xx, double yy) 
    x = xx;
    y = yy;
    cout << "constructor called" << endl;
  

  ~vec2() 
    static int count = 0;
    cout << "destructor " << count << endl;
    count++;
  

  virtual double Length()  return sqrt(x * x + y * y); 

  bool operator==(vec2& v)  return x == v.x && y == v.y; 

  virtual string toString() 
    stringstream s("");
    s << "[" << x << " " << y << "]";
    return s.str();
  
;

int main() 
  vector<vec2*> vecs;
  vecs.push_back(new vec2(1.8, 1.7));
  vecs.push_back(new vec2(1.99, 1.7));
  for (vec2* v : vecs) 
    cout << v->toString() << endl;
    delete v;
  

http://www.xgdev.com/notepad/textfiles/37631a.txt

【问题讨论】:

不使用指针并将其设为std::vector&lt;vec2&gt; 怎么样? 如果我使用普通的 vec2 会更慢,并且构造函数和析构函数被调用的次数更多,效率更低。 @Thomas,可能virtual 方法的存在是有原因的。 还有一个 vec3 类,但我没有包含它。 vec3 继承自 vec2 使用vector而不是使用指针实际上会更快。使您的指针变慢的原因是您为向量中的每个项目分配了一个新的。这对内存布局非常不利,您的指针最终会遍布各处,导致缓存未命中。直线布局,就像你使用 vector 得到的那样会更快,更容易维护。 【参考方案1】:

简单:

std::vector<std::unique_ptr<vec2>> vecs;
vecs.reserve(2);   // Optional
vecs.push_back(std::make_unique<vec2>(1.8 ,1.7));
vecs.push_back(std::make_unique<vec2>(1.99, 1.7));
for (auto& v : vecs) 
    cout << v->toString() << endl;

如果你有virtual 成员函数,那么析构函数很可能也应该是virtual

【讨论】:

复制构造函数被调用了吗? @user366866,没有。 使用emplace_back并保留怎么样? 1. reserve - 可能,是的。 2.如果使用std::make_unique,则emplace_backpush_back是等价的(比如微软STL中push_backT&amp;&amp;的重载只是调用emplace_back),emplace_back可以和@一起使用987654334@:emplace_back(new vec2(1, 2)),不过make_unique更好,***.com/questions/22571202/…

以上是关于如何将其切换到 unique_ptr?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 unique_ptr 从一组移动到另一组? (C++)

如何将 unique_ptr 捕获到 lambda 表达式中?

使用和不使用移动从 unique_ptr 构造 shared_ptr?

如何 push_back unique_ptr 参数到共享 ptr 的向量上

unique_ptr 到派生类作为函数的参数,该函数将 unique_ptr 带到基类

如何将 std::unique_ptr 初始化为引用