为啥将局部变量推回 Vectorworks
Posted
技术标签:
【中文标题】为啥将局部变量推回 Vectorworks【英文标题】:Why Does Pushing Back Local Variable to Vector Works为什么将局部变量推回 Vectorworks 【发布时间】:2019-01-24 01:58:00 【问题描述】:C++ 向量存储指向它存储的值的指针(即整数向量将存储指向整数的指针)。在以下代码中, int i 是 for 循环中的局部变量。一旦 for 循环完成,应该从内存中删除 int i 变量。因此,向量指针应该指向内存中的一些垃圾位置。
我将此代码插入 XCode,但它会打印“30313233”——本应从内存中删除的整数。
为什么要这样做?
int main(int argc, const char * argv[])
std::vector<int> vec;
for(int i = 30; i < 34; i++)
vec.push_back(i);
cout << vec[0];
cout << vec[1];
cout << vec[2];
cout << vec[3];
【问题讨论】:
【参考方案1】:C++ 向量存储指向它所存储的值的指针
不,那不是真的。 C++ 中的对象是真正的对象,它们不像 Java 中那样隐藏引用。1
int a = 1;
int b = a;
a = 3;
assert(b == 1); // b is a distinct object
在您的示例中,您正在推回i
。这意味着对象的副本将被添加到向量中,而不是变量本身。
1:从技术上讲,它确实存储了一个指针,但该指针是指向数组所在的内存块,其中存储了实际的int
s。但这是您(此时)不应该担心的实现细节。
【讨论】:
所以它 (1) 制作对象的副本,然后 (2) 将指向该对象副本的指针存储在内存中? (此时)我想知道我申请实习时的完整信息 @Y.Moondhra 1) 是,2) 不是。向量有一块内存。当您使用push_back
时,向量会在该内存块中创建一个新对象,它将您传递的对象复制到正在创建的新对象中。它存储的唯一指针是指向内存块的开头(如int a[] = 1, 2; int *b = a;
、b
是指向数组内存块的指针)。
现在我完全明白了。谢谢。【参考方案2】:
向量存储指向存储对象的内存块的指针,而不是单个对象。当您插入向量时,对象会复制到该内存块中。
【讨论】:
给了你赞成票,但它没有显示,因为我没有足够的代表。谢谢【参考方案3】:vector<int>
存储int
类型的值。 vector<int*>
存储int*
类型的值,即指向int
的指针。
【讨论】:
以上是关于为啥将局部变量推回 Vectorworks的主要内容,如果未能解决你的问题,请参考以下文章
一次定义2个int类型局部变量,这两个局部变量的地址为啥相差12个字节?