我正在试图找出一种方法来跟踪我所创建的类的所有实例,因此我可以使用标题字符串(或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");
此外,如果这是一个不好的方式来做我想做的事情,让我知道一个更好的方法。 谢谢!
答案 0 :(得分:3)
您确定没有将堆栈分配的对象添加到静态向量中吗?删除对象时是否删除了指针?
如果你想提高效率,我可以建议你使用一个地图,其中键可以是你的标题字符串/ id int和指针的值,这样搜索就会比解析整个数组快得多
答案 1 :(得分:1)
悬空指针有四个主要可能的原因:
在销毁实例
您创建跨越DLL边界的实例(并传递矢量arround)
你在代码的另一部分有一个缓冲区溢出(或类似),它会覆盖你的载体
您正在从多个线程同时访问该向量(并且对它的访问在您的代码中看起来不同步)
(这是我的所有猜测)。
要正确使用此类载体,您必须执行以下操作:
为您的类实现所有构造函数和析构函数(这意味着您还将根据五条规则实现赋值运算符)。
确保所有构造函数都将this
添加到向量
确保析构函数从向量中删除this
另外,建议重构:
将向量传递给对象,而不是将其声明为静态;这将允许您在客户端代码中决定是否有单个向量,多个向量或某种类型的窗口管理器对象,它在内部包含向量
将窗口创建参数分组到一个结构中,并将该arround作为参数传递
你的SWindow
类想成为一个窗口管理器和一个窗口;将窗口管理提取到单独的对象