【发布时间】:2015-08-03 20:17:42
【问题描述】:
我有一个指向其他结构的结构。例如,我的结构遵循与此类似的模式(尽管它们要复杂得多)。
typedef struct parent
{
string name;
int numOfKids;
child* children;
} parent
typedef struct child
{
string name;
details* information;
} child
typedef struct details
{
int age;
string bestFriend;
} details
要创建一组父母,我执行以下操作:
Parents * parents = new parents[numParents];
for(int i = 0; i< numParents; i++)
{
parents[i].children = new children[parents[i].numOfKids];
for (int j = 0; j < parents[i].numOfKids; j++)
{
parents[i].children[j].information = ( details* )malloc( sizeof( details ) );
memset( parents[i].children[j].details, 0, sizeof( details ) );
}
}
后来我试图像这样清理内存:
void clearParents(parents** pParents, int numParents)
{
for(int i = 0; i< numParents)
{
for(int j = 0; j< pParents[i]->numOfKids; j++)
{
free(pParents[i]->children[j].details);
}
delete [] pParents[i]->children
delete( pParents[i])
}
}
这个 clearParents 函数似乎在第一次循环时可以正常工作,但是在返回到内部循环时,它会崩溃
for (int j = 0; j < parents[i].numOfKids; j++)
出现错误:0xC0000005 访问冲突读取位置 0xCCCCCCD4
我猜这与我释放/删除父母数组中的内存有关,同时还尝试继续循环遍历它,但我不确定如何解决问题。
提前感谢您提供的任何见解
【问题讨论】:
-
omg 为什么所有的数组和
new和指针?是什么设计决定导致了这种情况? -
调试!!启动调试器,单步调试代码的每一行,观察变量如何变化。完成此操作之前不要在这里问!
-
不要将
new[]与delete混用 -
@LightnessRacesinOrbit 很遗憾,这不是我的决定。我实际上使用的是 NvAPI,结构代表了 Nvidia 构建的结构。如果您想查看我的实际分配情况,您可以在此处的答案中看到一个示例:stackoverflow.com/a/12012589/2252761 遗憾的是,Nvidia 没有提供任何关于如何在完成后释放内存的文档,并且我不想把整个结构放在这里,因为如果你以前没有看过它会很吓人。
-
如果你使用 std::vector,你的很多问题都会消失