C++ 指针向量的奇怪行为

C++ 指针向量的奇怪行为,c++,pointers,memory,vector,C++,Pointers,Memory,Vector,我在理解运行这段简单代码时得到的输出时遇到了一些困难 #include <vector> #include <iostream> #include "LxUNIXsys.h" using namespace std; int main(int argc, char** argv) { //memory management class LxUNIXsys mem_manager; vector <double*> vec; mem_ma

我在理解运行这段简单代码时得到的输出时遇到了一些困难

#include <vector>
#include <iostream>
#include "LxUNIXsys.h"
using namespace std;

int main(int argc, char** argv) {

  //memory management class
  LxUNIXsys mem_manager;

  vector <double*> vec;

  mem_manager.DumpMemoryInfo();getchar();
  for(int i =0; i < 3; i++) vec.push_back(new double (3));
  for(int i =0; i < vec.size(); i++) cout << *vec[i] << endl;
  mem_manager.DumpMemoryInfo();getchar();
  for(int i =0; i < vec.size(); i++) delete vec[i];
  vec.clear();
  for(int i =0; i < 3; i++) cout << *vec[i] << endl;
  cout <<"size of vec " <<vec.size() << endl;
  mem_manager.DumpMemoryInfo();

  return 0;
}
因此,基本上我删除了指针,不仅信息仍然存在,而且我可以在
clear()
之后访问它

我还尝试使用
delete[]
删除vec,但结果相同

PS:我知道智能指针的存在,但我想知道为什么这段代码没有达到预期的效果


PPS:我知道未定义的行为,在清除后忘记访问,我只是想要一种立即释放内存的有效方法,就像我删除一个常规指针一样。

您有未定义的行为。。这是因为您访问了根本不存在的
std::vector
元素。未定义的行为意味着任何事情都可能发生。甚至可以看出,应该销毁的对象仍然存在

< C++标准没有说明操作系统应该如何管理内存的分配和分配。它只是给出了程序可以依赖的规则。没有理由说为这三个
double
s分配的内存实际上不能在您要求的时间后由操作系统回收。你不能再依赖它了。您唯一可以依赖的是,您不应该在
std::vector
的范围之外访问


这正是标准将其指定为未定义行为的原因。它为操作系统或环境提供了执行其内存管理的自由空间,同时也为您的程序提供了定义良好的行为所依赖的规则。

我认为问题在于您读取向量的方式:

for(int i =0; i < 3; i++)
for(int i=0;i<3;i++)
用这条线,你可以读到向量的末尾。 即使它的内容被删除,它也可能会在内存中保留一段时间。这意味着一旦它被删除,您就不能再确定这些位置中保存的内容是删除之前存储的内容,但它可以是您存储的内容


这就像从硬盘中删除一个文件。这些位实际上一直存在,直到被重写,它们才被设置为未使用。

删除从空闲存储区分配的内存不能保证将其返回到操作系统,或使其无法访问。通常,小型分配由进程内的堆管理;它从系统中分配一个较大的块,并分配较小的块;删除的内存将返回到该堆。这比每次分配到系统中都要有效得多


这意味着被删除的内存仍然可以访问,并且在被重用之前,可能仍然包含被删除时存在的任何数据。因此,访问它会产生未定义的行为,而不是任何定义明确的错误。

您知道自己做了错误的事情,为什么对结果感到惊讶?删除不会清除其内部数据。您关注的是错误的事情。请阅读我的其他评论。那么,为什么内存没有下降呢?但我有一个算法,需要在for循环的迭代中立即释放类似类型的向量。有没有办法用这种方法做到这一点?当我删除不在向量中的指针时,内存会立即释放…@Gonçalo相信你的编译器和操作系统会为你管理它。只需编写代码,然后,如果您发现存在性能问题,就应该开始研究这个问题。我敢打赌根本没有问题。您的迭代可能只是重用分配的内存。这正是我问这个问题的原因。我正在做一个物理模拟,需要在每个周期中存储大量数据,然后进行处理,然后快速释放。我现在的行为是一个for循环,在调用删除我正在使用的所有向量之后,只会继续填充RAM而不清除它。@Gonçalo:你确定要删除分配的所有内容吗?空闲存储器应该能够在不填充RAM的情况下重用已删除的内存。如果您有内存泄漏,那么像Valgrind这样的工具可能有助于跟踪它。
Memory dump: [pid = 17012 ] mapped: 51476K    writeable/private: 7452K    shared: 0K

3
3
3
Memory dump: [pid = 17012 ] mapped: 51480K    writeable/private: 7456K    shared: 0K

3
3
3
size of vec 0
Memory dump: [pid = 17012 ] mapped: 51480K    writeable/private: 7456K    shared: 0K
for(int i =0; i < 3; i++)