地址与内存关系

计算机的内存看作是一排很长很长的房子,每个房子都可以放数据,通过一个房号来标识。
这个比喻颇为有用,也存在局阻性。计算机的内存由数以亿万计的位(bit)组成,每个位可以容纳值0或1.由于一个位所能表示的值的范出太有限,所单独的位用处不大,通常许多位合成一组作为一个单位(比如最小8位,char类型),这样就可以存储范围较大的值。画个图来描述机器中的内存位置。

继续阅读地址与内存关系

为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符

看下面一个表示string对象的类:

// 一个很简单的string类
class string {
public:
   string(const char *value);
   ~string();

  ...                           // 没有拷贝构造函数和operator=

private:
   char *data;
};

string::string(const char *value)
{
   if (value) {
     data = new char[strlen(value) + 1];
     strcpy(data, value);
   }
   else {
     data = new char[1];
     *data = '';
   }
}

inline string::~string() { delete [] data; }

继续阅读为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符

预先准备好内存不够的情况

operator new在无法完成内存分配请求时会抛出异常(以前的做法一般是返回0,一些旧一点的编译器还这么做。你愿意的话也可以把你的编译器设置成这样。关于这个话题我将推迟到本条款的结尾处讨论)。大家都知道,处理内存不够所产生的异常真可以算得上是个道德上的行为,但实际做起来又会象刀架在脖子上那样痛苦。所以,你有时会不去管它,也许一直没去管它。但你心里一定还是深深地隐藏着一种罪恶感:万一new真的产生了异常怎么办? 继续阅读预先准备好内存不够的情况

写operator new和operator delete时要遵循常规

自己重写operator new时(如果写了operator new就要同时写operator delete解释了为什么有时要重写它),很重要的一点是函数提供的行为要和系统缺省的operator new一致。实际做起来也就是:要有正确的返回值;可用内存不够时要调用出错处理函数(见预先准备好内存不够的情况);处理好0字节内存请求的情况。此外,还要避免不小心隐藏了标准形式的new,不过这是(避免隐藏标准形式的new)的话题。 继续阅读写operator new和operator delete时要遵循常规

尽量用new和delete而不用malloc和free

malloc和free(及其变体)会产生问题的原因在于它们太简单:他们不知道构造函数和析构函数。

假设用两种方法给一个包含10个string对象的数组分配空间,一个用malloc,另一个用new:   继续阅读尽量用new和delete而不用malloc和free