簡體   English   中英

C ++和共享庫中的代碼執行點

[英]Point of code execution in C++ and shared libraries

我和一位同事在使用共享庫和實際執行“ where”代碼時,對內存分配進行了有趣的討論。

提示:我正在明確地尋找一般的答案。 我知道在構建共享庫和應用程序時使用完全相同的編譯器和設置時,以下幾點將起作用。 我想假設DLL是使用與應用程序完全不同的編譯器構建的。

給定以下struct Foo

struct Foo
{
    int m_FooBar = 1;

    const char* GetBar()
    {
        return m_Bar.c_str();
    }

    void SetBar(const char* value)
    {
        m_Bar = value;
    }

private:
    std::string m_Bar;
};

假設共享庫公開了一個函數Foo* GetFoo() ,並且外部應用程序調用它:
1.)如果外部應用程序調用foo->SetBar("Hello")什么?
SetBar將在DLL中執行,從而m_Bar的內存分配是安全的,還是該內存分配發生在外部應用程序內部並因此導致問題?
2.)如果外部應用程序復制由返回的指針指向的實例會發生什么?
從許多警告那里警告不要在DLL邊界上傳遞std::string來判斷,我認為默認副本可能由潛在的不同ABI引起。 那是對的嗎?
3.)通過在傳遞的實例上調用.c_str()來定義構造m_Bar的自定義副本構造函數和賦值運算符是否安全,以使這些方法僅依賴於std::string的API而不依賴於ABI?

希望某些C ++專家可以回答其中的一些問題,並為該主題提供一些啟示。

1.)如果外部應用程序調用foo-> SetBar(“ Hello”),會發生什么? SetBar是否將在DLL中執行,從而m_Bar的內存分配是安全的,還是該內存分配發生在外部應用程序內部並因此導致問題?

有很多問題,不僅涉及內存分配或混合C運行時庫。

對於初學者來說, Foo甚至可能大小不一樣, std::string定義可能完全不同,等等,等等。

2.)如果外部應用程序復制由返回的指針指向的實例會發生什么? 從許多警告那里警告不要在DLL邊界上傳遞std :: string來判斷,我認為默認副本可能由潛在的不同ABI引起。 那是對的嗎?

無需復制就可以惹麻煩:由於您不知道它所指向的內存,即使使用 Foo ,也會破壞一切。

3.)通過在傳遞的實例上調用.c_str()來定義構造m_Bar的自定義副本構造函數和賦值運算符是否安全,以使這些方法僅依賴於std :: string的API而不依賴於ABI?

您嘗試最低級別的一般想法是好的。 但是,嘗試使用m_Bar是。

而是提供一個普通的C接口,並可選地在標頭中提供包裝器類。 而且即使在這種情況下,如果要鏈接不同的C運行時庫(在Windows中),也要小心分配/取消分配/使用系統資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM