删除结构

时间:2017-06-05 02:09:00

标签: c++ pointers memory-leaks dynamic-allocation

使用struct声明:

struct Dat {
   int count; // number of files
   string *files;
   Dat(): count(0), files(nullptr) {}
   ~Dat() {
      delete[] files;
   }
}

然后我构建了这样的文件:

buildFiles(int argc, char *argv, Dat my) {
   my.files = new string[my.count]; // my.files = new string[3]
   int filedex = 0;
   for (int i=0; i<argc; ++i) {
      if (some condition for argv[i]) { // only looking for filenames from argv
         my.files[filedex] = argv[i]; // store filename in my structure
         filedex++;
      }
   }
   if (filedex != my.count) cerr << "BAD";
}


int main (int argc, char *argv[])
{
   Dat my;
   // functions that define my.count to be non-zero, e.g. my.count = 3
   buildsFiles(argc, argv, my);
   // blahblah
   return 0;
} 

我现在如何删除动态分配的变量,文件? 我尝试了delete[] my.filesdelete[] my->files,但似乎都没有效果。我对c ++很新,所以任何帮助都会非常感激。

3 个答案:

答案 0 :(得分:0)

当我的时候;离开范围,调用析构函数,删除char指针数组。你不需要对存储的字符串做任何事情,因为它们只是指向argv数组内容的指针,这是由c ++处理的

现在你有错误。 my.count从零开始,因此它分配零空间。然后,即使没有分配空间,您也要写入内存。那很危险 - 它在堆栈上,所以你可以覆盖堆栈的重要值。

您需要预先分配一些空间并检查您是否尝试在阵列中存储太多内容。现在你正在玩带有记忆的俄罗斯轮盘赌。

如果您希望能够动态调整结构大小,则需要使用std :: vector或某种链接列表。

如果您坚持手动分配,则需要预先分配足够的空间(设定金额或计算要存储的物品数量),并检查以检测您是否已尝试访问分配内存之外的东西。

答案 1 :(得分:0)

看看这段代码,它将检测内存泄漏:

#include <crtdbg.h>

#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW

struct A
{
    int* num;
};

int main()
{
    A a;
    a.num = new int[10];

    delete[] a.num;

    _CrtDumpMemoryLeaks();

}

此摘录没有内存泄漏。因为每new[]delete[]被调用。

但如果您要评论delete[] a.num;,那么它会检测到泄漏:

Detected memory leaks!
Dumping objects ->main.cpp(14) : {66} normal block at 0x0000024280E47630, 40 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
Object dump complete.

因此,对于每个new,您需要一个delete,而对于每个new[],您需要一个delete[]

答案 2 :(得分:0)

你在buildFiles(int argc,char * argv [],Dat&amp; my)中使用了refrence,否则它会从main函数复制我的对象,但是在Dat中没有复制构造函数,所以它&# 39;不安全,析构函数将被调用两次。 ps:如果指针为NULL,你应该jugge,然后删除它并设置ad nullptr atfer。