【发布时间】:2015-10-22 07:48:15
【问题描述】:
我有一个关于如何正确删除结构及其内部声明的相应指针的问题。
我从我正在运行的项目中提取了一个示例,它似乎无法正常工作,代码没有崩溃,但似乎我有一些“内存泄漏”。我不确定这是正确的措辞。问题是这些值并没有真正重置,并且在我下次启动课程时保存在内存中。
下面的Sudocode:
标题:
ProgramHeader.h
class ClassA : public publicClassA
{
public:
ClassA(void);
virtual ~ClassA();
private:
struct ApStruct{
struct
{
float *refA[2];
float *refB[2];
float *pVarA;
} fR;
struct
{
float *refA[2];
float *refB[2];
float *pVarA;
} f1kHz;
};
ApStruct* GetApStruct;
}
计划:
Program.cpp
#include "ProgramHeader.h"
ClassA::~ClassA()
{
//EDIT i did a typo my looks like this:
//delete ApStruct; //Wrong code
delete GetApStruct; //Corrected - however still not working
}
main()
{
GetApStruct = new ApStruct();
//Do Code
}
希望这一切都有意义,
编辑: 我在代码中更新了一个错误的行 - 但是问题仍然是一样的。在我实施解决方案之前,我会先看看下面的内容。
2015 年 10 月 24 日编辑 我一直在尝试以下一些建议,但我无法找到解决问题的方法,我必须承认我也很难缩小可能导致问题的范围。
我的代码是 DLL 的一部分。该代码包含了一些我无法控制的源代码,因此我有有限的选择如何使用构造函数和指针上的 new 进行初始化。
我仍然认为我有内存泄漏问题的原因是,如果我在我的代码中添加一个“神奇的浮点数”,我的函数的输出会发生变化,即使浮点数是 在任何地方使用 - 它只是被声明。
在以下情况下我会得到不同的结果:
- 调用 InitCode - 一次!
- 然后我将多次调用 CallCode - 进行计算
- 销毁类的实例
当我再次重复上述操作时,我得到的结果与我第一次运行代码时不同,但之后它保持不变。
如果我加入魔法线似乎一切正常???
更新的 SudoCode:
Program.cpp
#include "ProgramHeader.h"
ClassA::~ClassA()
{
//EDIT i did a typo my looks like this:
//delete ApStruct; //Wrong code
delete GetApStruct; //Corrected - however still not working
}
main()
{
void initCode()
{
GetApStruct = new ApStruct();
float InitValue = 0.F
//Magic line:
float magicLine = 123456.f; //If this line is commented out i get different results in my code
//End Magic Line
fr.refA[0] = &InitValue;
fr.refA[0] = &InitValue;
fr.refA[0] = &InitValue;
fr.pVarA = &InitValue;
...
}
void CallCode()
{
float CallValue = 123.F
//Magic line:
float magicLine = 123456.f; //If this line is commented out i get different results in my code
//End Magic Line
fr.refA[0] = &CallValue;
fr.refA[0] = &CallValue;
fr.refA[0] = &CallValue;
fr.pVarA = &CallValue;
...
}
}
感谢大家的支持,
托马斯
【问题讨论】:
-
您确定需要指针数组吗?
std::array<float, 2>呢? -
values ... are kept in the memory next time i initiate a class这不是错误,可能会根据情况发生(但您还有其他错误)。如果您想删除某些内容,请在删除之前用 0 覆盖它。 -
我需要以这种方式声明的数组才能包装原始代码。所以我不能真正改变数组的语法是我“不能”改变使用它的源代码。解释起来有点复杂。
-
@deviantfan 不能删除吗?所以下次我启动课程时,它会重新分配所需的空间吗?我的 vars 比上面显示的要多,其中一些没有初始化为 0。
-
我认为你需要编写函数来重置你的值。原因 C++ 不会像在 Java 或 C# 中那样初始化值。
标签: c++ pointers memory struct garbage-collection