向量成员被重置且不可访问
A vector member is reset and unaccessible
我有两个项目,一个基本客户端和一个动态库。
这是客户端中发生的情况:
int main()
{
Scrutinizer scru;
scru.Scrutinize();
return 0;
}
在 DLL 中,Scrutinizer
class 本身就是 (__declspec(dllexport),为清楚起见省略了这些)
页眉
class ProcessesGenerator;
class Scrutinizer
{
public:
Scrutinizer();
~Scrutinizer();
ProcessesGenerator *ProcGenerator
void Scrutinize();
};
ProcessesGenerator
的前向声明对我来说 'mandatory' 是为了避免某种循环引用。
.cpp 文件中的构造函数
我是这样初始化的:
Scrutinizer::Scrutinizer()
{
ProcGenerator = &ProcessesGenerator();
}
更多关于此 ProcessesGenerator
class:
页眉
class ProcessesGenerator
{
public:
ProcessesGenerator();
~ProcessesGenerator();
WinFinder winFinder;
std::vector<std::string> fooCollec;
void GenerateProcesses();
};
ProcessesGenerator.cpp
构造函数:
ProcessesGenerator::ProcessesGenerator()
{
//winFinder = WinFinder();//problem will be the same with or without this line
fooCollec = std::vector<std::string>{"one", "two", "three"};
}
构造函数中的断点显示向量已使用所选值进行了初始化。
有问题的功能:
void ProcessesGenerator::GenerateProcesses() {
std::string foo = "bar";
fooCollec = std::vector<std::string>{};//read access violation
fooCollec.push_back(foo);//read access violation
winFinder.SomeVector= std::vector<std::string>{};//read access violation
}
在那里,我可以看到 vector 的大小被重置为 0。任何重新初始化它或推送元素的尝试都会导致读取访问冲突。与其 [=19 的 vecotr 成员相同=] 会员。我想这个缺陷很明显,但我真的不明白,
谢谢!
你的问题在于
Scrutinizer::Scrutinizer()
{
ProcGenerator = &ProcessesGenerator();
}
你正在做的是获取一个临时对象的地址。该对象将被销毁,该行的末尾将留下一个未指向有效对象的指针。
修复它的旧方法是使用
Scrutinizer::Scrutinizer()
{
ProcGenerator = new ProcessesGenerator();
}
但是现在你必须实现复制构造函数、复制赋值运算符和析构函数。因为你有一个现代编译器,你可以做的是使 ProcGenerator
成为 std:unique_ptr<ProcessesGenerator>
然后 Scrutinizer()
变成
Scrutinizer::Scrutinizer() : ProcGenerator(make_unique<ProcessesGenerator>()) {}
我还想补充一点 &ProcessesGenerator();
甚至不应该编译。不幸的是,MSVS 有一个允许编译的非标准扩展。您可以打开 /Za
编译器选项(强制 ANSI 兼容性)然后您应该会收到类似
的错误
error C2102: '&' requires l-value
ProcGenerator = &ProcessesGenerator();
行创建了一个临时 ProcessesGenerator
,获取其地址,然后将其放入您的 ProcGenerator
指针中。然后销毁临时文件,留下垃圾。
你可能想在堆上分配它 ProcGenerator = new ProcessesGenerator;
但即使在那种情况下我强烈建议使用 unique_ptr
而不是原始指针。
我有两个项目,一个基本客户端和一个动态库。 这是客户端中发生的情况:
int main()
{
Scrutinizer scru;
scru.Scrutinize();
return 0;
}
在 DLL 中,Scrutinizer
class 本身就是 (__declspec(dllexport),为清楚起见省略了这些)
页眉
class ProcessesGenerator;
class Scrutinizer
{
public:
Scrutinizer();
~Scrutinizer();
ProcessesGenerator *ProcGenerator
void Scrutinize();
};
ProcessesGenerator
的前向声明对我来说 'mandatory' 是为了避免某种循环引用。
.cpp 文件中的构造函数
我是这样初始化的:
Scrutinizer::Scrutinizer()
{
ProcGenerator = &ProcessesGenerator();
}
更多关于此 ProcessesGenerator
class:
页眉
class ProcessesGenerator
{
public:
ProcessesGenerator();
~ProcessesGenerator();
WinFinder winFinder;
std::vector<std::string> fooCollec;
void GenerateProcesses();
};
ProcessesGenerator.cpp
构造函数:
ProcessesGenerator::ProcessesGenerator()
{
//winFinder = WinFinder();//problem will be the same with or without this line
fooCollec = std::vector<std::string>{"one", "two", "three"};
}
构造函数中的断点显示向量已使用所选值进行了初始化。
有问题的功能:
void ProcessesGenerator::GenerateProcesses() {
std::string foo = "bar";
fooCollec = std::vector<std::string>{};//read access violation
fooCollec.push_back(foo);//read access violation
winFinder.SomeVector= std::vector<std::string>{};//read access violation
}
在那里,我可以看到 vector 的大小被重置为 0。任何重新初始化它或推送元素的尝试都会导致读取访问冲突。与其 [=19 的 vecotr 成员相同=] 会员。我想这个缺陷很明显,但我真的不明白,
谢谢!
你的问题在于
Scrutinizer::Scrutinizer()
{
ProcGenerator = &ProcessesGenerator();
}
你正在做的是获取一个临时对象的地址。该对象将被销毁,该行的末尾将留下一个未指向有效对象的指针。
修复它的旧方法是使用
Scrutinizer::Scrutinizer()
{
ProcGenerator = new ProcessesGenerator();
}
但是现在你必须实现复制构造函数、复制赋值运算符和析构函数。因为你有一个现代编译器,你可以做的是使 ProcGenerator
成为 std:unique_ptr<ProcessesGenerator>
然后 Scrutinizer()
变成
Scrutinizer::Scrutinizer() : ProcGenerator(make_unique<ProcessesGenerator>()) {}
我还想补充一点 &ProcessesGenerator();
甚至不应该编译。不幸的是,MSVS 有一个允许编译的非标准扩展。您可以打开 /Za
编译器选项(强制 ANSI 兼容性)然后您应该会收到类似
error C2102: '&' requires l-value
ProcGenerator = &ProcessesGenerator();
行创建了一个临时 ProcessesGenerator
,获取其地址,然后将其放入您的 ProcGenerator
指针中。然后销毁临时文件,留下垃圾。
你可能想在堆上分配它 ProcGenerator = new ProcessesGenerator;
但即使在那种情况下我强烈建议使用 unique_ptr
而不是原始指针。