C++;结构初始化问题 < C++代码工作正常,但是内存验证程序说我使用的是删除的指针: grf->filePath=fname;你知道为什么吗?多谢各位
迪尔加载器C++;结构初始化问题 < C++代码工作正常,但是内存验证程序说我使用的是删除的指针: grf->filePath=fname;你知道为什么吗?多谢各位,c++,C++,迪尔加载器 // Other code class CDirLoader { public: struct TKnownGRF { std::string filePath; DWORD encodingType; DWORD userDataLen; char *userData; }; // Other Code CDirLoader();
// Other code
class CDirLoader
{
public:
struct TKnownGRF
{
std::string filePath;
DWORD encodingType;
DWORD userDataLen;
char *userData;
};
// Other Code
CDirLoader();
virtual ~CDirLoader();
Dirloader.cpp
// Other code
void CDirLoader::AddGroupFile(const std::string& _fname)
{
// Other code including std::string fname = _fname;
TKnownGRF *grf = new TKnownGRF;
grf->filePath = fname;
delete grf; // Just for testing purposes
注:这只是一个代码摘录。当然,如果我在.cpp中定义一个结构TKnownGRF,并将其用作实际对象,gfr.filepath=something,而不是指针grf->filepath=something,那么它是可以的,但由于许多其他向量分配,我确实需要将它放在CDirLoader类的*.h中。因为函数返回
void
void CDirLoader::AddGroupFile(const std::string& _fname)
问题是你将如何处理grf
你要删除它吗?如果是这样的话,那么为什么一个新的?您可以在堆栈上声明一个TKnownGRF
变量!在这种情况下,\u fname
不会影响此方法的逻辑
我猜类CDirLoader
有一个类型为TKnownGRF
的成员变量,比如grf\uu
,需要在AddsGroupFile()
方法中使用,例如:
grf_.filepath = _fname;
这是否恰好是使用较旧版本的STL(例如VC6)并运行多线程的情况?STL的string类的旧版本使用了一个引用计数的写时拷贝实现,这在多线程环境中并不起作用
或者,也有可能您看到了错误的问题。如果调用std::string::c_str()
并缓存结果,则在修改原始字符串时,缓存的结果可能会无效。在一些情况下,您可以不受惩罚,但这是非常具体的实现。请您稍微拉开帷幕好吗?您可以传入fname并将fname指定给filePath。这是打字错误还是真正的代码?是的,还有更多的代码像:std::string fname=\u fname;地址(fname);-fname部分应该可以。问题是grf->filepath什么是fname
?您的代码中没有关于fname
的声明。看起来像是典型的内存泄漏,在CDirLoader::AddGroupFile
结束后grf
会发生什么?有std::vector grf;在Dirloader.h中引用“问题是你打算如何处理grf?你打算删除它吗?”不,我使用的是grf.push_back(grf);在void CDirLoader::AddGroupFile CDirLoader的末尾,除了grfs vectors和一些其他成员之外,没有TKnownGRF的成员。另外,如果我在*.cpp中定义另一个TKnowGRF结构,我可以使用gfr->filepath中的gfr.filepath。这解决了validator的问题,但我如何将其推回到原始TKnowGRF*的全局使用向量中。为了每个人的利益,请使用这些附加和有价值的细节更新问题。Globals是不好的,但是如果你没有选择,那么你必须使用grfs
,而且它似乎是grfs.push_-back(grf)代码>是有效的。不过,必须有一些代码要取消分配grfs
(例如grfs.clear()
)。引用“如果是这样,那么,为什么要做新的?”如果没有新的,我会得到警告:arning C4700:未经初始化就使用了局部变量“grf”和>取消分配grf谢谢你的想法,但我只是尝试注释grf。推回(grf);并把简单的删除grf放在那里;仅出于测试目的,验证器仍会在grf->FilePath中报告一个严重错误谢谢您的回答。但是,我们使用的是VC7.1,多线程应该可以。(希望:-)第二个想法我不确定,但我看不出有任何问题的部分。你能说得更具体些吗?其他与字符串相关的代码是:1 std::string fname=\u fname;2个定位酶(fname);3文件*f=fopen(fname.c_str(),“rb”);