为指向其他对象的成员编写C ++ Setters的正确方法是什么,以便没有内存泄漏或崩溃?

时间:2013-09-19 16:19:27

标签: c++ pointers

我对此进行了大量搜索。但可能是我没有得到正确的措辞。

考虑一下,

Class A {};

Class B {

public:
    A* getA();
    void setA(A *aVarParam);

private:
    A *aVar;
};

现在,因为aVar是B类的成员变量,所以我希望确保只要B类的相应对象存在,它就会保持活动状态。

所以我在这里看到的选项是,

  1. 制作aVarParam的深层副本并按住指针。
  2. 使用像Boost共享指针之类的东西。
  3. 这两者似乎都是太多的工作或丑陋的语法。我在这里错过了什么吗?所有C ++程序都使用这两个选项之一吗?

    更多说明:

    好的,很多人都希望看到我如何使用它的一个例子。实际上我想要一个通用策略的答案。因此,原始的例子。以下是我尝试使用的示例:

    #ifndef DBSCHEMA_H
    #define DBSCHEMA_H
    
    #include <string>
    #include <vector>
    #include "dbtable.h"
    
    namespace models {
    
        class DbSchema
        {
        public:
            explicit DbSchema();
    
            boost::shared_ptr<std::string> getSchemaName() const;
            void setSchemaName(const boost::shared_ptr<std::string> schemaName);
    
            std::vector<models::DbTable> getTableList() const;
            void setTableList(const std::vector<models::DbTable> tableList);
        private:
            boost::shared_ptr<std::string> schemaName_;
            std::vector<models::DbTable> tableList_;
        };
    
    }
    
    
    #endif // DBSCHEMA_H
    

    这里的类DbSchema被用作指导UI(A QT应用程序)的瘦模型。并且将有许多Schema Builders实际上将与不同的数据库通信以填充UI将使用的DBSchema对象。

    我希望这可以解决我想要实现的目标。我不是C ++程序员。在编写Java,Objective-C,PHP和JavaScript多年之后,我试图满足于编写“真正的C ++”应用程序。

3 个答案:

答案 0 :(得分:4)

为了这个问题,我假设你有一个存储指针的真正原因,而不是对象本身。但是,如果您的实际代码与示例类似,则没有充分的理由将指针存储到字符串。

第三种选择是取得对象的所有权。在C ++ 11之前,这很难实现,没有泄漏或悬挂指针的危险,但是现在我们已经移动了语义和unique_ptr,这是一个处理单个可转让所有权语义的智能指针。

#include <memory>

class B {
public:
    void setA(std::unique_ptr<A> aVarParam) {
        aVar = std::move(aVarParam);
    }

private:
    std::unique_ptr<A> aVar;
};

std::unique_ptr<A> myA(new A);
assert(myA);                   // we own the object
b.setA(std::move(myA));        // transfer ownership
assert(!myA);                  // we no longer own it

答案 1 :(得分:3)

如果你想要B拥有对象A那么它就不清楚了 对于在

之类的函数之后拥有该对象的用户

A* getA();

谁应该删除该对象?

即使使用shared_ptr还有其他语法 会让你的班级用户明白谁拥有 对象

std::shared_ptr<A> getA();

如果您想要将对象传递给其他人 请改用std::unique_ptr

没有太多的开销添加这个并且它使 您的代码更易于阅读。

答案 2 :(得分:3)

我认为你需要回答的第一个问题是概念问题。 谁应该拥有该资源,以及谁在使用它。

如果这两个是相同的,那么unique_ptr似乎是合适的,否则,shared_ptr / weak_ptr可能是合适的,但是再一次,在不了解你的整个问题的情况下,似乎很难给出明确的答案。

例如,如果你的类只是在没有拥有它的情况下使用资源,那么资源应该存储在某个地方的shared_ptr中,你的类应该只保存一个weak_ptr,并且只在它想要使用它时才锁定它,并准备好处理资源被删除的情况(如果发生这种情况)。

编辑:看到你的编辑后 看到你的代码,我不明白为什么你需要一个指针,只需使用经典的std :: string,一切都会好的...(除非我遗漏了一些东西,但这提出了一个问题:为什么一个指针?)