使用new分配内存的类需要自己定义拷贝构造函数

13.22 假定我们希望HasPtr的行为像一个值。即,对于对象所指向的string成员,每个对象都有一份自己的拷贝。

#include<iostream>
#include<string>
#include<new>

using namespace std;
class HasPtr
{
public:
    HasPtr(const string &s=string()):ps(new string(s)),i(0){cout<<"constructer"<<endl;}
    HasPtr(const HasPtr &h):i(h.i)
    {
        cout<<"copy constructer"<<endl;
        ps=new string;
        *ps=*h.ps;//只拷贝值
    }
    HasPtr& operator=(const HasPtr &h)
    {
        auto newp=new string(*h.ps);
        delete ps;
        ps=newp;
        i=h.i;
        return *this;
    }
    ~HasPtr() {  delete ps; cout<<"destructer"<<endl;}
private:
    string *ps;
    int i;
};
int main()
{
    HasPtr h;
    HasPtr hh(h);
    hh=h;
    return 0;
}

 

时间: 2024-09-28 12:44:05

使用new分配内存的类需要自己定义拷贝构造函数的相关文章

C++类对象的复制-拷贝构造函数

在学习这一章内容前我们已经学习过了类的构造函数和析构函数的相关知识,对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10; int b =a; 自己定义的类的对象同样是对象,谁也不能阻止我们用以下的方式进行复制,例如: #include <iostream>using namespace std;class Test{public: Test(int temp) { p1=temp; }protected: int p1;};void main(){ Test a(9

C++类对象的拷贝构造函数分析

对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=100;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #include <iostream>using namespace std;class CA{ public: CA(int b) { a=b; } void Show () { cout<<a<<endl; } private: int a;};int main(){

c++-初学者求教,关于数组分配内存的问题

问题描述 初学者求教,关于数组分配内存的问题 在c++中对于string这样的类类型,因为字符长度可变,在数组中怎样分配内存空间??? 解决方案 存的是string的指针,他只想实际字符串地址 解决方案二: 字符串分配内存,一般可以用动态分配.但是还要看你的具体要求 解决方案三: string是长度固定的,怎么叫可变? 字符串的相加.赋值等等都会产生一个新的字符串对象. 解决方案四: 动态分配,当空间不够了,就分配一块更大的空间,拷贝内容,删除原来的空间 解决方案五: string类型是一个对字

placement new 在一块已分配内存上创建对象

  placement new 是重载operator new的一个标准.全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本).它的原型如下: void *operator new( size_t, void *p ) throw()  { return p; } 首先我们区分下几个容易混淆的关键词:new.operator new.placement new new和delete操作符我们应该都用过,它们是对堆中

C# 的内存管理类的问题

问题描述 为什麽C#内存管理类BufferManager可以无限制分配内存,不受最大内存大小的限制?直至内存耗光?代码如下:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.ServiceModel.Channels;usingSystem.Collections;namespaceBufferTest{classProgram{staticvoidMain(stri

内存分配-请问C#这样定义从什么时候开始分配内存

问题描述 请问C#这样定义从什么时候开始分配内存 class Arr{ Arr() {} } 主程序: Arr[] a; a=new Arr[1];//此处是分配引用内存? a[0]=new Arr;//此处分配内存? 解决方案 a是一个对象,是Arr[]类型,a[0]也是一个对象.是Arr类型 前者实例化了一个Arr[]对象,后者实例化了一个Arr对象. 解决方案二: 另外,Arr和Arr[]一样,都是引用类型.除非你把Arr定义成结构体. 解决方案三: 前一个实例化分配多少内存?是分配保存地

不赋值是否就不分配内存

问题描述 /*2008年5月17日10:39:02*请问假设A是个类名*则Aaa;是不是只是声明了一个变量名aa,但是并没有给aa分配内存啊?**/usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespace__17_3{classA{publicvoidf(){Console.WriteLine("我猜,我猜猜猜!");}publicvoidg(){f();}}classProgram{staticvoi

(一二七)动态内存和类——第十二章

面对基本类型的时候,我们可以使用动态内存(new和delete).   而面对类的时候,也可以使用动态内存,只不过使用方法有区别.   例如声明一个私有成员,想要这个私有成员的值为一个字符串(但这个字符串是什么是未知的). 首先,不考虑用char word[40];这样的.原因有两点:①实际字符串可能超过40个字符:②对于没有超过的,很可能导致内存浪费(例如创建了1w个对象,有9000个只要一个字符长度,1000个需要40个字符长度):   因此,可以使用指针,让指针来指向字符串. 但单纯用指针

jvm对大对象分配内存的特殊处理(转)

    前段日子在和leader交流技术的时候,偶然听到jvm在分配内存空间给大对象时,如果young区空间不足会直接在old区切一块过去.对于这个结论很好奇,也比较怀疑,所以就上网搜了下,发现还真有这么回事.以下给出具体代码来说明: 首先定义好jvm内存各个区域的大小.我设定的是eden区8M,from和to各1M,old区10M,总共20M的空间,参数如下:   Shell代码   -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8       紧接着,开