您的位置:首页 > 其它

new delete 指针

2013-09-29 00:47 344 查看

PHP网站交流:45503780

第一部分:

一直对函数返回指针类型以及传递参数指针有颇深的见解,但面试的经历让我不得不针对自己的缺点进行一点点的完善。这就是传说中的笑话。

先抄一个例子,写一个类MyClass的赋值运算符函数:

MyClass * function operator =(const MyClass ¶m){//返回的类指针,及常量的参数引用

    if(¶m==this)

        return this;

    delete []m_data;//在类中声明了char * m_data; 的成员变量

    m_data=NULL;

    m_data=new char[strlen(param.m_data)+1];

    strcpy(m_data,param.m_data);//自己多少次写的都是m_data=param_m_data !!!

    return *this;

}

可能有很多疑惑,@为什么不返回一个对象,@为什么传递一个常量引用?

先说@1:若返回的是一个对象,则是无法进行 s1=s2=s3的操作的(书上这么说的)。你肯定有试过Class A=B,此时会调用A的构造函数,这么说s1=s2没有问题,在加上赋值运算符的作用,完全可以行的通!若果真这样想,呵呵,你错了,你的=号已经被这个operator=给重载了。这是只有通过指针了。

再说@2:假设传入的不是引用,系统会对param进行复制一个副本,消耗内存资源。同时,将参数定义成常量,将保持传入参数的事例状态。

附加说一下@delete,我们在分配新内存之前要先释放自己的内存空间,否则程序可能会出现内存泄露----这里我其实有很多话说,留到后面。

接下来说返回函数指针时应该注意的一些问题:

返回的指针所指向的数据不能够是函数内声明的变量。函数中的变量存储在栈内存中,函数返回时,系统会自动释放变量的内存,此时指针的地址被释放了。

第二部分:new delete使用

或许困惑自己的只是一个很小的知识点,先缕一下,也许你马上回“了感”。

@new 负责在堆内存中分配指定长度的内存空间,返回地址

@堆的性质就是需要程序员自己释放内存空间

举个例子说明一下,下面我自己写一个例子,可能存在问题,希望能说明问题,如果有错误,大家说出来。

//vector<int> z中的push_back函数;

    private int *p=new int[length];//类中存在成员变量length:数组的长度; count当前数组中元素的个数,p表示当前的vector
    int push_back(int m){
         int *q=NULL;
        if(count==length){
               length*=2;
q=new int[length];
if(!q){
return ;
}
              for(int i=0;i<count;i++){
                     q++=p++;
              }
              delete[] p;
              q++=m;
             count++;
             p=q;
        }
        else{
              p++=m;
        }
        return m;
}

第三部分:new delete的补充
//////
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  vector 指针 new delete