带有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.files
和delete[] 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。