我有两个项目,一个基本客户端和一个动态库。
这是客户端中发生的情况:
int main()
{
Scrutinizer scru;
scru.Scrutinize();
return 0;
}
在DLL中,
Scrutinizer
类是这样的(__declspec(dllexport),为清晰起见,省略了此类)标头
class ProcessesGenerator;
class Scrutinizer
{
public:
Scrutinizer();
~Scrutinizer();
ProcessesGenerator *ProcGenerator
void Scrutinize();
};
对我来说,
ProcessesGenerator
的前向声明是“强制性”,以避免某种形式的循环引用。.cpp文件中的构造方法
这是我如何初始化它:
Scrutinizer::Scrutinizer()
{
ProcGenerator = &ProcessesGenerator();
}
有关此
ProcessesGenerator
类的更多信息:标头
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。任何尝试重新初始化它或推入元素的操作都会导致读取访问冲突。与它的
WinFinder
成员的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兼容性),然后会出现如下错误:错误C2102:“&”需要左值
关于c++ - vector 成员已重置且无法访问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51597764/