Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
指向struct和delete的指针 学习C++,并尝试正确理解指针,新建和删除。 关于我的问题: 我创建了一些指向结构的指针,最后删除了它们。但是堆大小并没有减少。 我搜索了一些答案,发现了以下问题。。答案中的代码似乎正确地释放了堆_C++_Pointers_Struct - Fatal编程技术网

指向struct和delete的指针 学习C++,并尝试正确理解指针,新建和删除。 关于我的问题: 我创建了一些指向结构的指针,最后删除了它们。但是堆大小并没有减少。 我搜索了一些答案,发现了以下问题。。答案中的代码似乎正确地释放了堆

指向struct和delete的指针 学习C++,并尝试正确理解指针,新建和删除。 关于我的问题: 我创建了一些指向结构的指针,最后删除了它们。但是堆大小并没有减少。 我搜索了一些答案,发现了以下问题。。答案中的代码似乎正确地释放了堆,c++,pointers,struct,C++,Pointers,Struct,我愚蠢的学习代码: #include <iostream> using namespace std; struct daten { int iVal; daten *next; daten *prev; }; int main() { daten *first=nullptr; daten *prev=nullptr; daten *entry=nullptr; daten *last=nullptr; cout << "[Any

我愚蠢的学习代码:

#include <iostream>

using namespace std;

struct daten
{
  int iVal;
  daten *next;
  daten *prev;
};

int main()
{
  daten *first=nullptr;
  daten *prev=nullptr;
  daten *entry=nullptr;
  daten *last=nullptr;

  cout << "[Any Key] FILL";
  getchar();

  //fill
  for( int i=0;i<100000;i++)
  {
    if(!entry)
    {
      entry=new daten;
      entry->iVal=i;
      entry->next=nullptr;
      entry->prev=nullptr;
      first=entry;
      prev=entry;
      last=entry;
    }
    else
    {
      entry=new daten;
      entry->iVal=i;
      entry->next=nullptr;
      entry->prev=prev;
      prev->next=entry;
      prev=entry;
      last=entry;
    }
  }

  cout << "[Any Key] DELETE";
  getchar();  
  //delete
  prev=last;
  while(prev)
  {
    last=prev;
    prev=prev->prev;
    delete last;
    last=nullptr;
   }

  cout << "[Any Key] END";
  getchar();
}
#包括
使用名称空间std;
结构日期
{
国际竞争力;
日期*下一个;
日期*prev;
};
int main()
{
daten*first=nullptr;
daten*prev=nullptr;
daten*entry=nullptr;
daten*last=nullptr;
cout-next=nullptr;
输入->上一个=空PTR;
第一个=输入;
prev=输入;
最后一次=输入;
}
其他的
{
条目=新日期n;
输入->iVal=i;
entry->next=nullptr;
输入->上一个=上一个;
上一步->下一步=输入;
prev=输入;
最后一次=输入;
}
}
cout-prev;
最后删除;
last=nullptr;
}

cout如果您想了解程序的堆使用情况,确保正确使用malloc/free和new/delete,那么您应该使用像Valgrind这样的应用程序级工具


系统级工具通常会报告为堆保留的虚拟内存量,这些虚拟内存不一定全部提交。在应用程序的生命周期内,为堆保留的虚拟内存将增加,只有在运行时决定压缩时才会定期减少。

如果要了解程序的堆使用情况,请确保正确使用malloc/free和new/delete,然后,您应该使用应用程序级工具,如Valgrind


系统级工具通常会报告为堆保留的虚拟内存量,这些虚拟内存不一定全部提交。在应用程序的生存期内,为堆保留的虚拟内存将增加,只有在运行时决定压缩堆时,才会在运行时突发奇想时定期减少堆大小。

您如何监控堆大小?使用Linux和KDE Systemmonitor可以显示堆大小。glibc可以随时缩小堆大小。很多时候,虚拟内存的大小就像一个高水位线,它只是指示程序一次使用的最大内存量。我不认为你的程序中有任何错误,只是glibc的一个ism。这是一个高分也是我的想法,在我的其他代码中,添加一些数据堆后,删除并添加两倍的堆到2XX,删除并创建少于2XX的堆后,堆没有加密,所以看起来是使用量最高的。但我不确定我的结构是否真的被删除了。但是在链接的示例中,堆变为4GB(不记得了),并被完全释放。这就是我担心的原因。只是想正确地理解和学习。您如何监视堆的大小?使用Linux和KDE Systemmonitor可以显示堆的大小。glibc可以随时缩小堆的大小。很多时候,虚拟内存的大小就像一个高水位线,它只是指示程序一次使用的最大内存量。我不认为你的程序中有任何错误,只是glibc的一个ism。这是一个高分也是我的想法,在我的其他代码中,添加一些数据堆后,删除并添加两倍的堆到2XX,删除并创建少于2XX的堆后,堆没有加密,所以看起来是使用量最高的。但我不确定我的结构是否真的被删除了。但是在链接的示例中,堆变为4GB(不记得了),并被完全释放。这就是我担心的原因。只是想正确地理解和学习。谢谢。看起来真是个好帮手:-)我的代码是:“总堆使用率:100000 allocs,100000 frees,2400000 bytes allocated”和“所有堆块都被释放了——不可能有泄漏”,所以看起来不错谢谢。看起来真是个好帮手:-)我的代码是:“总堆使用率:100000个alloc,100000个frees,2400000个bytes alloced”和“所有堆块都被释放了——不可能有泄漏”,所以看起来不错