首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

新手思考再三才发的贴,不敢随便打扰,希望求解,析构函数有有关问题

2013-07-01 
新手思考再三才发的贴,不敢随便打扰,希望求解,析构函数有问题!#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
[解决办法]
引用:
   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类型的数据,那么:

引用:


#include<iostream.h>//最好改用<iostream>
#include <algorithm>//一会儿要用std::copy

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];sizeof(p)不是数组长度,而是指针类型变量的长度,32位系统下永远为4。sizeof(p)/sizeof(float)结果是0
        p_val=new float[sizeof(float) * s];//分配s个float  
                      
//p_val=p;指针赋值大错!*p_val = *p只复制第一个
                std::copy( p, p + s, p_val );//复制s个float
}

    CVector(const CVector &v){                            //拷贝构造函数
size=v.size;
//delete []p_val;  这里是构造函数,p_val尚未分配,删除什么?

p_val=new float[sizeof(float) * size];//分配size个float 
                std::copy( v.p_val, v.p_val + size, p_val );//复制size个float 
}

~CVector(){                                          
delete []p_val;
p_val=NULL;
}

CVector& operator = (const CVector &v){   
size=v.size;
delete []p_val;//删除之前分配的空间
p_val=new float[sizeof(float) * size];//分配size个float 
                std::copy( v.p_val, v.p_val + size, p_val );//复制size个float 
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;
}







初学,有错希望指正过来。谢谢!!

[解决办法]
        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的用处
[解决办法]

引用:

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();

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;
}
[解决办法]

引用:
Quote: 引用:


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();

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标准
[解决办法]
引用:
Quote: 引用:

 else{val = nullptr;//NULL??????    在vs2010中nullptr是没有问题的 nullptr用于空指针,而NULL除了空指针,还可以表明其他意思,

这个是否是标准,还是VC独有的?
记得VC的 CLI也有个类似的东西!

http://blog.csdn.net/soaliap/article/details/7663865
c++ 11标准
多谢!

热点排行