【发布时间】:2014-04-20 06:58:49
【问题描述】:
我正在尝试学习 C++ 以及从我在书籍和 SO 中读到的内容:
如果我使用auto x = new Object(); x 是一个指向 Object 地址的指针,它在动态内存中并且存在直到我删除它。
但是,如果我使用 Object x; 或 auto x = Object(),它只会持续到超出范围。
在一个例子中,他们展示了这一点:
void foo()
{
Point p = Point(0,0);
} // p is now destroyed.
我不明白的是,当我不使用 new 时返回一个对象会发生什么?它会是对象的副本吗?
这是一个我不确定的例子:
class Object
{
public:
int X;
static Object Foo(int y)
{
Object result;
result.X = y;
return result;
}
};
class TestContainer
{
public:
void Run()
{
for(auto i = 0; i < 10; i++)
{
_objects.at(i) = Object::Foo(i + (rand() % 10 + 1));
}
}
private:
std::vector<Object> _objects;
};
void main()
{
TestContainer tc;
while(true)
{
tc.Run();
}
}
请注意,我没有测试过这段代码,但我认为它消除了我的困惑。在我的主要功能中,我实例化了 TestContainer 并无休止地调用它的 Run 方法。这反过来循环调用 Object 上的静态 Foo 方法,该方法返回一个新 Object 的副本,该副本存储在一个向量中。
我的问题是,所有对象会发生什么?如果我用新对象替换对象向量中的元素 2,旧值现在是否“超出范围”并被删除?
【问题讨论】:
-
我认为你的
_objects.at(i)表达式会抛出,因为_objects从未指定大小。 -
@FredLarson:很好的观察。
-
是的,谢谢弗雷德。错过了。
-
警告:
auto x = new Object();与auto x = new Object;不同。你可能想要后者。更多信息:stackoverflow.com/questions/620137/…