c++ - vector 成员被重置且不可访问

标签 c++ pointers vector forward-declaration

我有两个项目,一个基本客户端和一个动态库。 这是客户端中发生的情况:

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"};
}

构造函数中的断点显示 vector 已使用所选值进行了初始化。

有问题的功能:

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();
}

但是现在您必须实现复制构造函数、复制赋值运算符和析构函数。因为你有一个现代编译器,你可以做的是 make ProcGenerator一个std:unique_ptr<ProcessesGenerator>然后 Scrutinizer()成为

Scrutinizer::Scrutinizer() : ProcGenerator(make_unique<ProcessesGenerator>()) {}

我还想补充一点 &ProcessesGenerator();甚至不应该编译。不幸的是,MSVS 有一个允许编译的非标准扩展。您可以打开 /Za编译器选项(强制 ANSI 兼容性)然后你应该得到一个错误,如

error C2102: '&' requires l-value

关于c++ - vector 成员被重置且不可访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51597764/

相关文章:

c - 指针采用什么样的数据结构?

c - scanf ("%d"中的错误格式说明符,unsigned short int) 在 gets(pointer) 更改 char 指针的值之后,但为什么呢?

c++ - 将 read() 直接用于 C++ std :vector

c++ - 自由落体问题

c++ - 本地类模板

c++ - Visual Studio 的 "Add reference"实际上是做什么的?

C++ - 为什么 std::function<some_type_t, void> 无效?

char指针数组赋值

c++ - 自定义 vector 类 C++

c++ - 从析构函数调用线程 vector