【问题标题】:Assumptions when accessing private member pointer inside class访问类内部私有成员指针时的假设
【发布时间】:2017-02-19 21:15:56
【问题描述】:

我有一个类,它包含一个指向结构的私有指针(这是托管的 C++,结构是本机的)。这个指针指向的对象基本上是在构造函数中创建的,并且一直存在到包含的类被释放为止。一旦在Foo 的构造函数中分配了指针,就没有代码可以将指针重新分配给另一个对象,而且我不认为将来会有任何代码。

我对与使用智能指针有关的答案不感兴趣,因为我在一些遗留代码中使用了大量原始指针。移植所有内容是另一回事,并且正在计划中。

我的问题是:

  1. 就有效性而言,在课堂上工作时,我可以假设指针是什么?

  2. 1234563是构造的(如果这是本机 C++,我只会将指针设为实际对象以使其消失)?
  3. 不涉及为SomeStructType 或智能指针创建另一个托管包装器的任何更好的方法?

    public ref class Foo
    {        
        private:
    
        SomeStructType* pMyStruct;        
    
        void Initialize()
        {
            pMyStruct = new SomeStructType();
        }
    
        void DoSomethingElse1();  //Uses pMyStruct
        void DoSomethingElse2();  //Uses pMyStruct
    
        public:
    
        void DoSomething();  //Uses pMyStruct or calls private func that does
    
        Foo()
        {
            Initialize();
        }
    
        ~Foo()
        {
            delete pMyStruct;
        }
    }
    

【问题讨论】:

  • 建议改写“在没有创建另一个包含类实例的情况下重新分配指针时不应该有实例”,因为我可以阅读这三种不同的方式,并且可能所有这些方式都是错误的。
  • 我不知道我的托管 C++ 扩展,但在 Plain Jane C++ 中,您的示例将很快与 Rule of Three 发生冲突。
  • @user4581301 1. 我同意“三法则”的评论。我还没有走得那么远(我将如何重构课程),但是 2. 我重新措辞了那句话。真的,我只是说指针在构造函数中分配并在析构函数中删除。除了访问它指向的对象之外,没有其他任何计划。

标签: c++ pointers managed-c++


【解决方案1】:

不,您不需要每次都检查它,因为合同(和 C++ 规则)暗示该对象将始终存在于您可以尝试以有效方式访问它的任何时候。

如果它可以重新分配,并且您处于多线程环境中,您可能希望锁定对它的访问。这将是我能想到的唯一问题。

【讨论】:

  • 你能解释一下“C++ 规则”是什么意思吗?我假设你的意思是因为指针指向一个在类的生命周期内存在的对象,我不需要担心它?不需要锁,因为这只会在一个线程中使用。
猜你喜欢
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多