自大学以来没有使用C++后,我试图使用具有两种类型的子对象的向量,而且我显然得到了一些错误。包含多态对象的向量:静态断言错误
最初我使用了一个可以工作的指针向量,但是如果我理解正确,那么在清除时会泄漏内存。
我得到的错误导致我相信它与类中的静态计数器有关(与最后一个成员一起销毁?),但删除并没有解决它。
错误会导致在此,在stl_construct.h:
#if __cplusplus >= 201103L
// A deleted destructor is trivial, this ensures we reject such types:
static_assert(is_destructible<_Value_type>::value,
"value type is destructible");
#endif
嗯,好吧,但我的析构函数都明确声明。我记得父类应该使用虚拟析构函数并修复它,但问题依然存在。
将构造函数/析构函数移到公共虚拟父类上不应该(事实上也没有)改变它。
现在我假设我以某种方式滥用向量。这是我的例子:
主:
#include <stdio.h>
#include "Foo.h"
#include <iostream>
Bar buildBar();
int main(int argc, char **argv)
{
std::vector<Foo> Foos;
Foos.reserve(1);
Foos.push_back(buildBar());
for (int idx=(0);sizeof(Foos);idx++)
{
try {
std::cout << "x = " << Foos.at(idx).getLoc().at(0);
}
catch (std::exception& e) {
std::cout << idx << ": Index out of range" << std::endl;
}
}
Foos.clear();
return 0;
}
Bar buildBar()
{
Bar* temp = new Bar(5,6);
return *temp;
}
foo.h中,用构造移到头:
#ifndef FOO_H
#define FOO_H
#include <vector>
class Foo
{
public:
//int maxoID(){return lastoID;} //0-indexed
/* Other things */
virtual std::vector<int> getLoc(){ return {x_Base,y_Base};}
Foo():
//oID(-1),
x_Base(-1),
y_Base(-1){}
virtual ~Foo(){}
protected:
int x_Base;
int y_Base;
};
class Bar : public Foo
{
public:
Bar(int x1, int y1):
x_End(-1),
y_End(-1)
{
x_Base = x1;
y_Base = y1;
}
~Bar(){}
std::vector<int> getLoc() {return {x_Base,y_Base,x_End,y_End};}
protected:
int x_End;
int y_End;
};
#endif // FOO_H
你'buildBar()'函数是内存泄漏的向量提取的元素。 – juanchopanza
“_Initially我使用了一个向量指针,它的工作,但如果我理解正确,这将在清除时泄漏内存。”所以,为什么不使用'std :: unique_ptr'的std :: vector?相关阅读:[什么是对象切片?](https://stackoverflow.com/questions/274626/what-is-object-slicing) –
'sizeof(Foos)'不会告诉你向量中有多少项。 (它会告诉你它占用了多少字节,但不包含它所包含的数据)。 – Galik