簡體   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