删除字符串指针在struct中的内存

Deleting String Pointers Memory in Struct

本文关键字:内存 struct 字符串 指针 删除      更新时间:2023-10-16

带有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 的新手,因此对任何帮助都将不胜感激。

dat my;叶子范围称为击层,它删除了一系列的char指针。您无需对存储的字符串做任何事情,因为它们只是指向ARGV数组的内容的指针,该串件由C

处理

现在您有错误。我的计数开始为零,因此分配了零空间。然后,即使没有分配空间,您也将写入记忆。这很危险 - 它在堆栈上,因此您可以覆盖堆栈的重要值。

您需要预先分配一些空间,并检查是否尝试在数组中存储太多东西。现在,您正在用记忆写作俄罗斯轮盘赌。

如果您想飞行调整结构大小,则需要使用std :: vector或某种链接列表。

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

有一个查看此代码,该代码将检测内存泄漏:

#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[]

您在buildfiles(int argc,char *argv [],dat&amp; my(中使用过的折叠,否则它将从主函数中复制我的对象,但没有dat中的复制构造函数,因此不安全,驱动器将被称为两次。PS:如果指针为null,则应该删除并设置ad ad nullptr。