[英]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.