【发布时间】:2019-03-09 13:39:11
【问题描述】:
参考以下代码sn-p。
据我了解:
a) 'p1' 和 'p2' 对象在堆栈中创建,并在 getPoints() 方法结束时被销毁。
b) 当使用 push_back() 将 p1 和 p2 添加到向量中时,默认分配器会创建 Point 的新实例 并将 p1 和 p2 的值 (x,y) 复制到这些新创建的实例中。
我的问题是:
1) 我的理解正确吗?
如果是这样;
2) 如果分配器创建了新的 Point 对象,为什么我只看到两行“Points created”?
因为我希望看到 p1 和 p2 的两行,以及分配器新创建的对象的两行。
3) 分配器如何将原始值分配给新创建对象的 x,y 字段?它使用原始内存副本吗?
4) 共享指针是从方法返回向量的推荐方式吗?
#include <iostream>
#include <vector>
using namespace std;
struct Point {
Point() {
std::cout<< "Point created\n";
x=0;
y=0;
}
int x;
int y;
};
std::shared_ptr< vector<Point> > getPoints() {
std::shared_ptr< vector<Point> > ret = std::make_shared< vector<Point> >();
Point p1;
p1.x=100;
p1.y=200;
Point p2;
p2.x = 1000;
p2.y = 2000;
ret->push_back(p1);
ret->push_back(p2);
return ret;
}
int main(int argc, char** argv)
{
std::shared_ptr< vector<Point> > points = getPoints();
for(auto point : *(points.get())) {
std::cout << "Point x "<<point.x << " "<< point.y<<"\n";
}
}
【问题讨论】:
-
调用了默认的复制构造函数,这就是为什么你只看到两行。
-
@101010 "Point()" 不是默认构造函数吗?
-
Point()是您定义的默认构造函数。但是当推回一个向量时,复制构造函数被调用。您尚未定义复制构造函数,因此编译器会在幕后为您定义一个。 -
如果你需要一个对象的共享所有权,你应该使用
shared_ptr。一个好的默认值是只返回一个vector。 -
请注意,最好使用member initializer list 编写构造函数,而不是在主体中使用assingments,例如
Point::Point() : x(0), y(0) { std::cout << "Point created\n"; }
标签: c++ stl shared-ptr stdvector allocator