这个c ++代码工作正常,但是内存验证器说我在使用删除指针: grf-> filePath = fname;你知道为什么吗?谢谢。
Dirloader.h
// 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
P.S。:这只是一个代码提取。当然,如果我在.cpp中定义一个结构TKnownGRF并将其用作实际对象,gfr.filepath = something,而不是指针grf-> filepath =某些东西,而不是它可以,但我需要在里面* .h在CDirLoader类中,由于许多其他矢量分配。
答案 0 :(得分:0)
由于该函数返回void
void CDirLoader::AddGroupFile(const std::string& _fname)
问题是你要对grf
做什么?
你要去delete
吗?如果是,那么,为什么要new
?你可以在堆栈上声明一个TKnownGRF
变量!在这种情况下,_fname
对此方法的逻辑没有贡献。
我想类CDirLoader
有一个TKnownGRF
类型的成员变量,比如grf_
,需要在AddsGroupFile()
方法中使用,例如:< / p>
grf_.filepath = _fname;
答案 1 :(得分:0)
这是否恰好使用旧版本的STL,比如VC6,并运行多线程?旧版本的STL的字符串类在写入实现时使用了引用计数副本,这在多线程环境中并不真正起作用。 See this KB article on VC 6
或者,您也可能正在查看错误的问题。如果您调用std::string::c_str()
并缓存结果,则在修改原始string
时,缓存的结果可能会失效。在某些情况下,您可以侥幸逃脱,但这是非常具体的实现。