这不是一个关于为什么要编写这样的代码的问题,而更多的是关于如何执行一个方法与它绑定的对象有关的问题。如果对象调整其自己的容器,会发生什么情况?
如果我有一个像结构:
struct F
{
// some member variables
void doSomething(std::vector<F>& vec)
{
// do some stuff
vec.push_back(F());
// do some more stuff
}
}
我用它是这样的:
std::vector<F>(10) vec;
vec[0].doSomething(vec);
发生什么情况,如果在doSomething(...)
的push_back(...)
导致矢量扩展?这意味着vec[0]
将被复制,然后在执行其方法的过程中被删除。这不会有好处。
有人可以解释究竟发生了什么吗?
- 程序是否会立即崩溃?该方法是否试图对不存在的数据进行操作?
- 该方法是否在对象的“孤立”中运行,直至遇到像更改对象状态一样的问题?
我感兴趣的是方法调用与关联对象的关系。
感谢您的答案。您是否认为该计划可能会继续进行而不会崩溃?如果我将数组的边界写入空闲内存,则会被检测到。什么可以让一种方法能够毫无问题地写入空闲内存? – user487100
您几乎可以永久写入“释放”的内存而不会崩溃。这就是内存映射的工作方式。地图保持原位以供将来的物体使用。但是,您可以**从不**写入已释放的内存“没有问题”。只是“问题”不是崩溃。 –
@ user487100:如果您将数组的边界写入空闲内存,则会检测到_sometimes_。制作一个案例我可以很容易地写下来,但是我可以写出超过最后的结果,而不是一段时间内检测出来。分配一个'char * a = new char [1]',然后读写'a [1]',它可能不会在大多数系统上触发任何错误。 –