【发布时间】:2018-07-30 15:48:32
【问题描述】:
我有两个项目,一个基本客户端和一个动态库。 以下是客户端中发生的情况:
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
}
在那里,我可以看到向量的大小被重置为 0。任何重新初始化它或推送元素的尝试都会导致读取访问冲突。与其WinFinder 成员的 vecotr 成员相同。我猜这个缺陷很明显,但我真的不明白,
谢谢!
【问题讨论】:
-
你用的是什么编译器?
ProcGenerator = &ProcessesGenerator();不应该编译。 -
我在 Windows 10 下的 Visual Studio 2017 上,并使用“构建”功能或单击“本地 Windows 调试器”进行编译
-
@NathanOliver 这是众所周知的讨厌的 MS 功能 - 温度到左值的隐式转换
-
@Slava 这只是犯罪。这和他们将临时对象绑定到非 const 引用一样糟糕。
标签: c++ pointers vector forward-declaration