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”);