簡體   English   中英

訪問類中的指針向量

[英]Accessing vector of pointers in a class

我正試圖找出一種方法來跟蹤我所創建的類的所有實例,因此我可以使用標題字符串(或int ID)隨時訪問它們

我決定使用指向每個實例的指針的靜態向量,然后在創建每個實例時,我將向它添加指向它的指針。

這可以達到一個點但是在某一點上,向量的每個元素內的值似乎重置/獲得隨機分配的值,我無法弄清楚發生了什么。

我在這里將對象添加到向量:

SWindow::SWindow(LPCWSTR WindowClass, LPCWSTR Title, UINT Style, int x, int y, int height, int width, HWND hParWnd, HINSTANCE hInstance)
    :
    x(x),
    y(y)
{
    hWnd = CreateWindowEx(NULL, WindowClass, Title, Style, x, y, height, width, hParWnd, NULL, hInstance, NULL);
    SWindows.push_back(this);

值更改的函數是:它是SWindow類的成員

SWindow.h:

static SWindow* GetSWindow(wstring ws);

SWindow.cpp:

 SWindow* SWindow::GetSWindow(wstring ws)
{
    for (int i = 0; i < SWindow::SWindows.size(); i++)
    {
        if (SWindows[i]->title == ws)
        {
            return SWindows[i];
        }
        else
        {
        }
    }

    return 0;
}

我正在使用以下方法從另一個類訪問該函數:

SWindow* pPlayViewer = SWindow::GetSWindow(L"Viewer");

此外,如果這是一個不好的方式來做我想做的事情,讓我知道一個更好的方法。 謝謝!

您確定沒有將堆棧分配的對象添加到靜態向量中嗎? 刪除對象時是否刪除了指針?

如果你想提高效率,我建議你使用一個地圖,其中鍵可以是你的標題字符串/ id int和指針的值,這樣搜索將比解析整個數組快得多。

懸空指針有四個主要可能的原因:

  • 在銷毀實例時,不要從向量中刪除實例

  • 你創建跨越DLL邊界的實例(並傳遞矢量arround)

  • 你在代碼的另一部分有一個緩沖區溢出(或類似),它會覆蓋你的向量

  • 您是從多個線程同時訪問向量(並且對它的訪問在您的代碼中看起來不同步)

(這是我的所有猜測)。

要正確使用此類向量,您必須執行以下操作:

  • 為你的類實現所有構造函數和析構函數(這意味着你也將根據五條規則實現賦值運算符)。

  • 確保所有構造函數都this添加到向量中

  • 確保析構函數從向量中刪除this

另外,建議的重構:

  • 將向量傳遞給對象,而不是將其聲明為靜態; 這將允許您在客戶端代碼中決定是否有單個向量,多個向量或某種類型的窗口管理器對象,它在內部保存向量

  • 將窗口創建參數分組到一個結構中,並將該arround作為參數傳遞

  • 你的SWindow類想成為一個窗口管理器和一個窗口; 將窗口管理提取到單獨的對象中

暫無
暫無

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

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