数组中对象的作用域 假设C++中有一个对象数组,并从数组中移除其中一个对象。什么时候调用该对象的析构函数?因为C++没有自动垃圾收集,如果析构函数在从数组中移除后调用了,那么它就显得很奇怪。但是,在数组超出范围之前,对象是否一直处于分配状态?这似乎会导致内存泄漏

数组中对象的作用域 假设C++中有一个对象数组,并从数组中移除其中一个对象。什么时候调用该对象的析构函数?因为C++没有自动垃圾收集,如果析构函数在从数组中移除后调用了,那么它就显得很奇怪。但是,在数组超出范围之前,对象是否一直处于分配状态?这似乎会导致内存泄漏,c++,memory-leaks,destructor,C++,Memory Leaks,Destructor,编辑: 与其“删除”,不如将数组的一个元素设置为另一个对象 另外,当从std::vector中删除元素时会发生什么情况?您不能“从数组中删除一个对象”。数组的大小是固定的。所有内容都是在创建数组时构造的,在销毁数组时销毁 如果只为数组元素指定一个新值,则调用对象的=运算符,其行为与使用一个简单的独立变量并为其指定一个新值时没有区别。不一定要建造或毁坏任何物体。如果有任何新对象,则它来自编译器为赋值语句右侧生成的临时对象。语句完成后,临时对象将被销毁。阵列中的对象保持不变 当您从向量中删除一个项时

编辑:

与其“删除”,不如将数组的一个元素设置为另一个对象

另外,当从
std::vector
中删除元素时会发生什么情况?

您不能“从数组中删除一个对象”。数组的大小是固定的。所有内容都是在创建数组时构造的,在销毁数组时销毁

如果只为数组元素指定一个新值,则调用对象的
=
运算符,其行为与使用一个简单的独立变量并为其指定一个新值时没有区别。不一定要建造或毁坏任何物体。如果有任何新对象,则它来自编译器为赋值语句右侧生成的临时对象。语句完成后,临时对象将被销毁。阵列中的对象保持不变

当您从
向量
中删除一个项时,它的析构函数会被调用,正如您所期望的那样,后面的元素会下移以填补空白。

您不能“从数组中删除一个对象”。数组的大小是固定的。所有内容都是在创建数组时构造的,在销毁数组时销毁

如果只为数组元素指定一个新值,则调用对象的
=
运算符,其行为与使用一个简单的独立变量并为其指定一个新值时没有区别。不一定要建造或毁坏任何物体。如果有任何新对象,则它来自编译器为赋值语句右侧生成的临时对象。语句完成后,临时对象将被销毁。阵列中的对象保持不变


当您从
向量
中删除一个项时,它的析构函数将被调用,正如您所期望的那样,随后的元素将下移以填补空白。

对于标准容器,如,在remove方法完成时,对象已被析构函数

对于“c样式”数组,对象本身的持续时间将与不在数组中的对象一样长


对象的生存期取决于对象的分配位置。如果它在堆栈上,则在当前作用域结束时解除分配;如果它在堆上,则在对其调用
delete
之前不会解除分配。最后一种情况是,如果对象从未被释放,则会导致内存泄漏。

对于标准容器,例如,在remove方法完成时,对象已被销毁

对于“c样式”数组,对象本身的持续时间将与不在数组中的对象一样长


对象的生存期取决于对象的分配位置。如果它在堆栈上,则在当前作用域结束时解除分配;如果它在堆上,则在对其调用
delete
之前不会解除分配。最后一个案例会导致内存泄漏,如果对象从不释放。

当你声明C++数组时,它会构建栈上的所有对象,并且它们一直存在直到数组本身被删除:

std::string ArrayOfStrings[10]; //There are now ten strings here
无法从此类数组中“删除”对象。当ArrayOfString超出范围时,它会自动删除数组中的所有字符串。如果编辑此数组中的对象,则该对象本身会发生更改。您实际上更改了字符串本身,而不是某些指针或引用

如果你有一组指针,那么C++就可以构造所有的指针,但是你必须管理他们指向你自己的东西:

std::string* ArrayOfPointersToStrings[10];
您可以手动删除数组中指针指向的字符串,但您必须自己完成所有操作。当ArrayOfPointersToString超出范围时,它不会删除字符串所指向的任何内容。如果您编辑一个指针而不先删除它,那就是内存泄漏,这很糟糕

如果你有一个STD::vector,C++只根据你如何构造它构建一些对象:

std::vector<std::string> VectorOfStrings(10);
std::向量串(10);
这将创建字符串的动态数组。可以从向量中删除对象,在这种情况下,向量会立即删除对象并为您重新排列其余对象。如果编辑此数组中的对象,则该对象本身会发生更改。您实际上更改了字符串本身,而不是某些指针或引用

为澄清评论:

char *myLiteral = "APPLE";
//"APPLE" is an immutable string, myLiteral points at it.
std::string s= myLiteral; 
std::string t = myLiteral;
//s and t each makes a _seperate_ _mutable_ copy of "APPLE"
s[3] = '?'; 
//s is now "APP?E", because we just changed the L.  NO COPY WAS DONE. 
std::cout << t[3];
//displays "L", because t's copy was never changed.
char*myLiteral=“苹果”;
//“苹果”是一个不变的字符串,myLiteral指向它。
std::string s=myLiteral;
std::string t=myLiteral;
//s和t各自制作了一份“苹果”的独立副本
s[3]='?';
//s现在是“应用程序?E”,因为我们刚刚更改了L。没有复制。

STD::CUT

当你声明C++数组时,它会构建栈上的所有对象,并且它们一直存在直到数组本身被删除:

std::string ArrayOfStrings[10]; //There are now ten strings here
无法从此类数组中“删除”对象。当ArrayOfString超出范围时,它会自动删除数组中的所有字符串。如果编辑此数组中的对象,则该对象本身会发生更改。您实际上更改了字符串本身,而不是某些指针或引用

如果你有一组指针,那么C++就可以构造所有的指针,但是你必须管理他们指向你自己的东西:

std::string* ArrayOfPointersToStrings[10];
您可以手动删除数组中指针指向的字符串,但您必须自己完成所有操作。当ArrayOfPointersToString超出范围时,它不会删除字符串所指向的任何内容。如果您编辑一个指针而不先删除它,那就是内存泄漏,这很糟糕

如果你有性病