【问题标题】:std::vector destructor gives errorstd::vector 析构函数给出错误
【发布时间】:2014-04-19 19:27:24
【问题描述】:

我有这样的课程:

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

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

谢谢!

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

【问题讨论】:

  • 您可能在未发布的代码中的某处损坏了内存。
  • 通过Foo::Foo()Foo::~Foo() 的简单实现,我能够毫无问题地运行这两种方法。
  • 我只有 std::vector。根本没有指针,我也没有对向量索引做任何奇怪的事情。所以我不确定内存损坏是如何发生的。
  • 我刚才添加的构造函数会不会有问题?
  • 你到底为什么要在你的 Foo 构造函数中将 m_struct 归零?您刚刚弄乱(阅读:损坏)结构中的整个 std::vector 并撤消了向量构造函数的工作。

标签: c++ class memory vector destructor


【解决方案1】:

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

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

【讨论】:

  • 可能,更像是肯定的。
  • 我确实删除了那个 memset,但问题仍然存在。请参阅我在问题底部添加的更新。任何想法为什么 dllexport 在这里可能会出现问题?
【解决方案2】:

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

  • 就代码生成而言,应用程序和 DLL 未使用相同的编译器选项进行编译。

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

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 2015-01-04
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 2014-11-25
  • 2022-01-19
相关资源
最近更新 更多