访问类中的指针向量

时间:2015-10-15 19:05:03

标签: c++ class pointers vector static

我正在试图找出一种方法来跟踪我所创建的类的所有实例,因此我可以使用标题字符串(或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");

此外,如果这是一个不好的方式来做我想做的事情,让我知道一个更好的方法。 谢谢!

2 个答案:

答案 0 :(得分:3)

您确定没有将堆栈分配的对象添加到静态向量中吗?删除对象时是否删除了指针?

如果你想提高效率,我可以建议你使用一个地图,其中键可以是你的标题字符串/ id int和指针的值,这样搜索就会比解析整个数组快得多

答案 1 :(得分:1)

悬空指针有四个主要可能的原因:

  • 在销毁实例

  • 时,不会从向量中删除实例
  • 您创建跨越DLL边界的实例(并传递矢量arround)

  • 你在代码的另一部分有一个缓冲区溢出(或类似),它会覆盖你的载体

  • 您正在从多个线程同时访问该向量(并且对它的访问在您的代码中看起来不同步)

(这是我的所有猜测)。

要正确使用此类载体,您必须执行以下操作:

  • 为您的类实现所有构造函数和析构函数(这意味着您还将根据五条规则实现赋值运算符)。

  • 确保所有构造函数都将this添加到向量

  • 确保析构函数从向量中删除this

另外,建议重构:

  • 将向量传递给对象,而不是将其声明为静态;这将允许您在客户端代码中决定是否有单个向量,多个向量或某种类型的窗口管理器对象,它在内部包含向量

  • 将窗口创建参数分组到一个结构中,并将该arround作为参数传递

  • 你的SWindow类想成为一个窗口管理器和一个窗口;将窗口管理提取到单独的对象