C++从公共成员函数返回指针的矢量/映射
C++ returning a vector/map of pointers from a public member function
我有一个关于从类中的公共成员函数返回指向向量或指针映射的指针的含义的快速问题。
这是我的代码:
这是B类中的一个成员函数
vector<A*>* ClassB::getfunction(){
returns m_test;
}
m_test是指向指针向量的指针类型的B类的私有数据成员。这个对象将在堆上初始化,所以我需要在类析构函数中删除它(包括向量中的所有元素(。
然后我将使用如下所示的函数。
B* ex_B = new B();
vector<A*>* ex_ptr_vecA = new vector<A*>;
ex_ptr_vecA = ex_B->getfunction();
我的问题:
既然我有两个对象的内存都分配在堆上,我需要同时删除它们吗?
顺序重要吗?以下内容正确吗?
B* ex_B = new B();
vector<A*>* ex_ptr_vecA = new vector<A*>;
ex_ptr_vecA = ex_B->getfunction();
//do something with ex_ptr_vecA
//Then I want to delete the allocate memory to the heap
//delete class B first
delete ex_B;
//and then the vector
//need to loop over vector elements and delete one at a time
for(int i =0; i < ex_ptr_vecA; i++){
delete ex_ptr_vecA->at(i);
}
delete ex_ptr_vecA;
这是正确的吗?还是我会因为类B的析构函数已经取消了堆内存的分配而试图删除悬挂指针?
B* ex_B = new B();
vector<A*>* ex_ptr_vecA = new vector<A*>;
在这里,您分配了2个内存块,并将这些块开头的地址存储在相应的指针变量中。一切都好。
ex_ptr_vecA = ex_B->getfunction();
现在,您已经将ex_ptr_vecA重新分配给getfunction()
返回的任何地址。您不再拥有新vector<A*>
返回的地址,您无法再释放它,因此内存泄漏。
如果你只需要指向ex_B
的内部vector<A*>
的指针,那么简单地说:
vector<A*>* ex_ptr_vecA = ex_B->getfunction();
您在示例代码ex_ptr_vecA
中显示的方式指向您在ex_B
类中分配的相同向量。如果ex_B
删除了它的析构函数中的内部向量,那么delete ex_ptr_vecA;
意味着你删除了两次——这是未定义的行为。
虽然我不认为行
ex_ptr_vecA = ex_B->getfunction();
编译(将"vector of pointers"=>"pointer to vector of指针"赋值(,则只需要两次删除。B拥有在ex_ptr_vecA中返回的指针,因此它并且只有它对其销毁负责。您的代码已更正:
B::B() : m_test( new vector<A*>() ) {}
B::~B() { delete m_test; }
B* ex_B = new B();
vector<A*>* ex_ptr_vecA;
ex_ptr_vecA = ex_B->getfunction();
// Do something
delete ex_B;
你看,这个代码的重点是,每个新代码都有一个相同级别的删除代码,以便于考虑分配和解除分配。为了进一步简化,请阅读RAII。
分配
ex_ptr_vecA = ex_B->getfunction();
将导致内存泄漏,因为分配的内存
new vector<A*>
届时将无法访问。不会有指向内存的指针,所以你没有任何机会释放它…
我建议您使用共享智能指针,这样您就可以忘记释放分配的内存以及应该执行的顺序。
- 如何在 C# 中映射双 C 结构指针?
- 智能指针作为无序映射键,并通过引用进行比较
- C++:映射结构中的结构指针
- 如何创建对象函数指针C++映射?
- 整数键映射到头文件中的成员函数指针
- C++在一个映射中存储不同的指针类型(并处理销毁)
- 添加要映射的对象的唯一指针
- 通过指针或引用将映射传递给函数?
- 在映射中存储模板类函数指针
- c++:复制、删除和运算符=在原始指针映射中
- 将唯一指针插入std::映射
- 在循环(C++)中用新指针填充映射
- C++:如何初始化包含具有给定键的指针列表的映射
- 如何将带指针的结构插入到映射中
- 重构MFC消息映射以包括完全限定的成员函数指针
- C 正确的方法来初始化和处理映射指针
- 定义基于模板的映射指针,以便在验证范围时将 int 解析为枚举
- C++中的静态无序映射指针初始化
- 动态分配映射指针值
- 如何在c++中维护映射指针的向量