新手思考再三才发的贴,不敢随便打扰,希望求解,析构函数有问题!#includeiostream.hclass CVector {privat
新手思考再三才发的贴,不敢随便打扰,希望求解,析构函数有问题!
#include<iostream.h>
class CVector {
private:
float* p_val;
int size;
public:
CVector(int s,float *p){
size=s;
p_val=new float[sizeof(p)/sizeof(float)+1];
p_val=p;
}
CVector(const CVector &v){ //拷贝构造函数
size=v.size;
delete []p_val; //删除之前分配的空间
p_val=new float[sizeof(v.p_val)/sizeof(float)]; //按照传入的v.p_val重新分配空间
}
~CVector(){ //就是这个析构函数,不知道为什么,将析构函数删除了之后就没事了
delete []p_val;
p_val=NULL;
}
CVector& operator = (const CVector &v){
size=v.size;
delete []p_val;//删除之前分配的空间
p_val=new float[sizeof(v.p_val)/sizeof(float)]; //按照传入的v.p_val重新分配空间
p_val=v.p_val;
return *this;
} //赋值运算符重载
void display(){cout<<"size:"<<size<<" "<<"p_val:"<<*p_val<<endl;}
};
int main()
{
float a=1323.12123123f,b=1213.12123123f,*p,*q;
p=&a;q=&b;
CVector temp(12,p),temp1(12,q);
temp.display();
temp1.display();
temp=temp1;
temp.display();
return 0;
}
初学,有错希望指正过来。谢谢!! C sizeof 类
[解决办法]
#include<iostream>
using namespace std;
class CVector {
private:
float* p_val;
int size;
public:
CVector(int s,float *p){
size=s;
p_val=new float[sizeof(p)/sizeof(float)+1];
//这里是*p_val吧。。。要不你new的空间就没有意义了。。
//你析构函数delete的不是new出来的空间。。而是p所指的空间。。
//所以会出错。。
*p_val=*p;
}
CVector(const CVector &v){ //拷贝构造函数
size=v.size;
delete []p_val; //删除之前分配的空间
p_val=new float[sizeof(v.p_val)/sizeof(float)]; //按照传入的v.p_val重新分配空间
}
~CVector(){ //就是这个析构函数,不知道为什么,将析构函数删除了之后就没事了
delete []p_val;
p_val=NULL;
}
CVector& operator = (const CVector &v){
size=v.size;
delete []p_val;//删除之前分配的空间
p_val=new float[sizeof(v.p_val)/sizeof(float)]; //按照传入的v.p_val重新分配空间
*p_val=*v.p_val;//还有这里也是。。
return *this;
} //赋值运算符重载
void display(){cout<<"size:"<<size<<" "<<"p_val:"<<*p_val<<endl;}
};
int main()
{
float a=1323.12123123f,b=1213.12123123f,*p,*q;
p=&a;q=&b;
CVector temp(12,p),temp1(12,q);
temp.display();
temp1.display();
temp=temp1;
temp.display();
return 0;
}
[解决办法] p_val=new float[sizeof(p)/sizeof(float)+1];
sizeof(p) = 4 sizeof(float) = 4
[解决办法]我的理解也是这样,最后还要加个1,这什么意思啊?
------解决方案--------------------
p_val=new float[sizeof(p)/sizeof(float)+1];
p_val=p;
现在p_val指针的内容不再是分配出来的空间,所以delete []p_val出错鸟
[解决办法]我理解你的CVector是浮点向量,里面存储着多个float类型的数据,那么:
[解决办法] sizeof(p)不是数组长度,而是指针类型变量的长度,32位系统下永远为4。sizeof(p)/sizeof(float)结果是1,p_val=new float[sizeof(p)/sizeof(float)+1]就相当于p_val = new[2]。
[解决办法]我也被搞糊涂了:
p_val=new float[s];
p_val=new float[size];
就可以了。
[解决办法]
class CVector
{
private:
float* val;
int size;
public:
CVector()
{
val = nullptr;
size = 0;
}
CVector(float* f, int n)
{
size = n;
val = new float[n];
memcpy_s(val, n * sizeof(float), f, n * sizeof(float));
}
CVector(const CVector &v)
{
size = v.size;
val = new float[size]; 此句之前不能调用delete[] val,因为此时val是个野指针
memcpy_s(val, size * sizeof(float), v.val, size * sizeof(float));
}
~CVector()
{
delete[] val;
}
CVector& operator = (const CVector &v)
{
size = v.size;
delete[] val; 此处就可以delete了
val = new float[size];
memcpy_s(val, size * sizeof(float), v.val, size * sizeof(float));
return *this;
}
void print()
{
for(int k = 0; k < size; k++)
cout<<val[k]<<endl;
}
};
float f[] = { 1.1f, 1.2f, 1.3f, 1.4f, 1.5f };
CVector v(f, 5);
v.print();
CVector v2(v); 拷贝构造函数
v2.print();
CVector v3;
v3 = v; 重载=运算符
v3.print();
[解决办法]计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
[解决办法]
我就是觉得lz理解错了sizeof的用处
[解决办法]
CVector& operator = (const CVector &v)
{
if(&v ==this)return *this; //防止自赋值
size = v.size;
delete[] val; //此处也不是当然就可以的,不过大多数时候,不出错就是了。
// 添加了防止自赋值的代码,才是真的可以delete了,
if(size){
val = new float[size];
//这个函数不知道传入大小为0的数据,可以正常工作不?这里就不深究了!
memcpy_s(val, size * sizeof(float), v.val, size * sizeof(float));
}
else{val = nullptr;//NULL??????
}
return *this;
}
[解决办法]
CVector& operator = (const CVector &v)
{
if(&v ==this)return *this; //防止自赋值
size = v.size;
delete[] val; //此处也不是当然就可以的,不过大多数时候,不出错就是了。
// 添加了防止自赋值的代码,才是真的可以delete了,
// 的确。 对于这种情况 CVector v = f; 调用的是拷贝构造函数
// 而CVector v; v=f才是调用 此函数
if(size){
val = new float[size];
//这个函数不知道传入大小为0的数据,可以正常工作不?这里就不深究了! 应该可以
memcpy_s(val, size * sizeof(float), v.val, size * sizeof(float));
}
else{val = nullptr;//NULL?????? 在vs2010中nullptr是没有问题的 nullptr用于空指针,而NULL除了空指针,还可以表明其他意思
}
return *this;
}
[解决办法] else{val = nullptr;//NULL?????? 在vs2010中nullptr是没有问题的 nullptr用于空指针,而NULL除了空指针,还可以表明其他意思,
这个是否是标准,还是VC独有的?
记得VC的 CLI也有个类似的东西!
http://blog.csdn.net/soaliap/article/details/7663865
c++ 11标准
[解决办法]
else{val = nullptr;//NULL?????? 在vs2010中nullptr是没有问题的 nullptr用于空指针,而NULL除了空指针,还可以表明其他意思,
这个是否是标准,还是VC独有的?
记得VC的 CLI也有个类似的东西!
http://blog.csdn.net/soaliap/article/details/7663865
c++ 11标准
多谢!