繁体   English   中英

std::vector 析构函数给出错误

[英]std::vector destructor gives error

我有一个这样的课程:

class Foo
{
public:
    Foo() {};

    ~Foo() {};

    void MyFunc(int a)
    {
        m_struct.my_vec.push_back(a);
    }

public:
    MyStructType m_struct;
}

和 MyStructType 的定义类似于:

struct MyStructType
{
    std::vector<int> my_vec;
}

问题是,当我按如下方式实例化类时,当调用 m_struct 析构函数时,出现 std::vector 解除分配的内存冲突错误:

void main()
{
    Foo f;
    f.m_struct.my_vec.push_back(10);
}

但是,如果我按照以下方式执行,结果是相同的,但我没有收到任何错误:

int main()
{
    Foo f;
    f.MyFunc(10);
}

对我来说,这两种方法应该是相同的。 鉴于实际代码比上面的代码段更复杂,我更愿意公开 m_struct 并使用第一个选项。 关于为什么在释放向量时第一种方法会出错的任何建议?

谢谢!

更新:我注意到问题实际上出在 dll_export 中,我上面没有提到。 我正在生成一个 dll 并在另一个项目中使用它。 如果我删除 dllexport 并将函数的定义(虽然是空的)放在头文件中,它运行正常。 但是当我导出我的类并将定义放在 cpp 文件中时,它给了我错误。 有任何想法吗?

删除这一行: memset(&m_struct, 0, sizeof(m_struct);

它可能会破坏 MyStructType 中的向量。 你为什么这样做?

既然您说您使用 dll_export,那么损坏的原因可能是以下一种或多种:

  • 在代码生成方面,应用程序和 DLL 没有使用相同的编译器选项进行编译。

  • 应用程序和 DLL 在运行时使用不同的堆。

对于第一项,您必须确保编译器选项(例如结构打包)以及任何其他会以某种方式更改类内部结构的选项是相同的。 但更基本的是,应用程序和 DLL 必须使用相同版本的编译器进行编译。

对于第二项,您必须确保应用程序和 DLL 使用相同的堆。 为此,DLL 和应用程序都必须使用运行时库的 DLL 版本。

当您有一个处理动态分配内存的类时,例如std::vector传递和跨模块边界使用这些类变得容易出错。 请注意,问题不在于std::vector ,因为如果该类使用堆,则任何类,即使是您编写的类,也会遇到相同的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM