显示问题的示例源代码:
#include<iostream>
#include<deque>
#include<memory>
using namespace std;
class Element
{
public:
Element()
{
fptr = new float[10];
ele1 = 0;
}
~Element()
{
if (fptr != NULL)
delete[] fptr;
}
void print()
{
cout<<"ele1: "<< ele1 <<endl;
for(int i = 0; i != 10; i++)
{
cout<<"ele "<<i<<": "<<fptr[i]<<endl;
}
}
float ele1;
float* fptr;
private:
};
void InsertElement(deque<Element>& dq)
{
Element el;
float* z = new float[10];
for(int i = 0; i != 10; i++)
z[i] = i;
for(int i = 0; i != 10; i++)
el.fptr[i] = z[i];
el.ele1 = 10;
dq.push_back(el);
}
int main(int argc, char* argv[])
{
deque<Element> dq;
cout<<dq.size()<<endl; // check size of the dequeue.
InsertElement(dq); // insert a Element with a buffer of float[10]
dq.front().print();
return 0;
}
执行上述代码的结果:
0
ele1: 10
ele 0: -1.5884e+038
ele 1: -1.5884e+038
ele 2: -1.5884e+038
ele 3: -1.5884e+038
ele 4: -1.5884e+038
ele 5: -1.5884e+038
ele 6: -1.5884e+038
ele 7: -1.5884e+038
ele 8: -1.5884e+038
ele 9: -1.5884e+038
为什么值与预期不符,它们已在 InsertElement 函数中进行了修改,并且 dq 是通过引用传递的。我无法弄清楚上面的代码有什么问题? 很明显,不属于数组的 ele1 获得了在 InsertElement 函数内部分配的值,而不是数组。即使我们为它分配了 0 到 9 的值,数组似乎也未初始化。为什么会出现这种奇怪的行为?请帮我解释一下,我真的很困惑。
代码的另一个问题:由于 delete[] 而调用 Element 类的析构函数时,它会在程序结束时抛出异常。我以前修复过,但现在的代码正在导致异常。不知道为什么。