【问题标题】:How to initialize unmanaged static pointer in C++/CLI code?如何在 C++/CLI 代码中初始化非托管静态指针?
【发布时间】:2009-08-17 04:59:13
【问题描述】:

我无法在托管类中初始化静态本机指针。

以下是详细信息:我创建了一个 C++/CLI 控制台项目并在其中声明了一个静态非托管指针。但是我无法以任何方式初始化静态指针(但如果我将指针放入匿名命名空间,就没有问题,在代码中进行了演示)。有没有遇到过类似的情况并找到解决办法?

代码在这里:

class MyTask
{
public:
    int m_index;
    MyTask()
    {
        m_index = 0;
    }
};

namespace
{
    static MyTask* s_pTask;
}

public ref class MyApplication
{
public:
    static MyTask* sm_pTask;

    static void InitizlizeStaticMembers(MyTask* pTask)
    {
        sm_pTask = pTask;
    }

    void AddTask()
    {
        sm_pTask = new MyTask();
    }
};

void main()
{
    MyApplication^ app = gcnew MyApplication();

    // 1st, doesn't work (sm_pTask is still null after the execution)
    MyApplication::sm_pTask = new MyTask();
    // 2nd, doesn't work (pTask can be initialized correctly, sm_pTask is still null after the execution)
    MyTask* pTask = new MyTask();
    MyApplication::InitizlizeStaticMembers(pTask);
    // 3rd, doesn't work (sm_pTask is still null after the execution)
    app->AddTask();
    // 4th, work(s_pTask can be initialized correctly)
    s_pTask = new MyTask();
}

【问题讨论】:

    标签: .net static c++-cli


    【解决方案1】:

    我发现(使用 VS2005)调试器确认了您所说的内容 - 指针的值在更新时不会改变。但是如果你让它输出一些东西,代码实际上是可以工作的。

    我相信这是调试器中的一个错误。

    【讨论】:

    • VS2008 似乎也有同样的问题,但在 VS2010 Beta 中似乎已得到纠正。我确认当您使用 std::cout 本机方法或 System::Console::WriteLine() 托管方法打印值时,此代码的行为似乎正确。
    【解决方案2】:

    我没有看到代码有任何问题,它对我来说很好用。不需要匿名命名空间。

    #include "stdafx.h"
    #include <iostream>
    
    class MyTask
    {
    public:
        int m_index;
        MyTask()
        {
            m_index = 0;
        }
    };
    
    static MyTask* s_pTask;
    
    public ref class MyApplication
    {
    public:
        static MyTask* sm_pTask = NULL;
    
        static void InitizlizeStaticMembers(MyTask* pTask)
        {
            sm_pTask = pTask;
        }
    
        void AddTask()
        {
            sm_pTask = new MyTask();
        }
    };
    
    void main()
    {
        MyApplication^ app = gcnew MyApplication();
    
        // 1st, doesn't work (sm_pTask is still null after the execution)
        std::cout << "MyApplication::sm_pTask before new " << MyApplication::sm_pTask << '\n'; // 0
        MyApplication::sm_pTask = new MyTask();
        std::cout << "MyApplication::sm_pTask after new " << MyApplication::sm_pTask << '\n'; // 003B8170
    
        MyTask* pTask = new MyTask();
        std::cout << "pTask= " << pTask << '\n'; // 003B81A0
        MyApplication::InitizlizeStaticMembers(pTask);
        std::cout << "MyApplication::sm_pTask = " << MyApplication::sm_pTask << '\n'; // 003B81A0
    
        app->AddTask();    
        s_pTask = new MyTask();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      相关资源
      最近更新 更多