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