【发布时间】:2014-12-16 22:57:09
【问题描述】:
我最近在使用向量作为成员编码类时遇到了一个奇怪的错误。这个bug是我自己引入的,但运行时的结果让我很震惊。简化示例如下所示。
基本上,该错误出现在构造函数中,其中h2 的大小仅为dimension_ 而不是dimension_*dimension_,这导致h2 在void A::set() 和double A::get() 中的访问超出范围。我承认有这样的错误是我的坏事。我认为应该发生的是void A::set() 中的h[2] 和h[3] 将访问一些随机内存地址或仅在向量h2 的保留范围内。但真正发生的是当调用析构函数时,会引发free() 错误,然后是很多虚拟的Backtrace,我不想在这里列出。
*** glibc detected *** ./a.out: free(): invalid next size (fast): 0x0000000001637040 ***
但如果我不访问void A::set() 中的h[3],就不会发生这种情况。我的问题是向量和析构函数到底发生了什么?向量的析构函数是否知道我访问了哪些元素?我认为向量只知道它的大小并在调用析构函数时释放内存。
任何想法将不胜感激。谢谢。
以下是显示运行时错误的示例代码。
#include<vector>
#include<cstddef>
#include<iostream>
class A
{
public:
A(size_t dimension);
virtual ~A();
public:
virtual double get();
virtual void set();
protected:
const size_t dimension_;
std::vector<double> h1, h2;
};
A::A(size_t dimension):
dimension_(dimension),
h1(dimension_*dimension_),
h2(dimension)
{}
A::~A()
{
}
double A::get()
{
set();
double result(0), temp(0);
for(size_t i(0); i < dimension_; ++i)
{
temp = 0;
for(size_t j(0); j < dimension_; ++j)
{
temp += h1[j] * h2[j + i*dimension_];
}
result += temp * h1[i];
}
return result;
}
void A::set()
{
h1[0] = h1[1] = h1[2] = h1[3] = 0.5;
h2[0] = h2[1] = h2[2] = h2[3] = 0.005;
}
int main()
{
A mya(2);
std::cout << mya.get() << "\n";
return 0;
}
【问题讨论】:
标签: c++ vector free destructor