使用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 ++很新,所以任何帮助都会非常感激。
答案 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。