载体构件被复位和不可访问(A vector member is reset and unaccess

2019-10-29 08:24发布

我有两个项目,一个基本的客户端和一个动态库。 下面是在客户端会发生什么:

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。任何试图重新初始化,或在读访问冲突.Same其的vecotr成员推动的元素结果WinFinder成员。 我猜的缺陷是显而易见的,但我真的不明白这一点,

谢谢!

Answer 1:

你的问题是与

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:“&”需要-1-值



Answer 2:

ProcGenerator = &ProcessesGenerator(); 使临时ProcessesGenerator ,需要它的地址,然后把它放在你的ProcGenerator指针。 然后,将临时被摧毁,留下的垃圾。

你可能想在堆中被分配它ProcGenerator = new ProcessesGenerator; 但即使在这种情况下,我会强烈建议使用unique_ptr原始指针来代替。



文章来源: A vector member is reset and unaccessible