c++ 矩阵问题、引用计数、指针、new

设计一个表示矩阵的类Matrix,假设矩阵元素都是int型。矩阵元素存放在一块动态分配的内存中,为了避免在矩阵运算中频繁拷贝内存,允许多个Matrix对象引用同一块内存,并使用引用计数(Reference Counting)技术记录引用该内存的对象数目。
请在Matrix类中使用指针型私有成员int *pData 指向存放矩阵元素的内存;并用私有指针型成员int *pRefCount指向pData的引用计数器。
用私有成员int rows, cols分别表示矩阵的行数和列数。
1、编写构造函数Matrix(int_rows, int _cols, const int *values),其中参数分别表示矩阵的行数、列数以及矩阵元素,注意,在构造函数中分配内存pData,并将values中的元素拷贝到新内存中。并为引用计数器分配内存,用pRefCount记录该内存地址,并将引用计数初始化为1.

2、编写拷贝构造函数。注意:拷贝构造函数中,新构造的对象与原对象共享pData和pRefCount,但是要将引用计数+1:(*pRefCount)++。

3、编写拷贝赋值函数。M=N,被赋值的对象M获得对象N的pData和pRefCount,并将引用计数+1:(*pRefCount)++。注意,在修改M对象的pData和pRefCount之前,要对M对象的引用计数-1:(*pRefCount)--,当M对象的引用计数为0时,表明没有其它对象使用了M.pData,这时要释放M的pData和pRefCount所指向的内存。

1、“用pRefCount记录该内存地址,并将引用计数初始化为1.”这个是什么意思呀。
2、那个拷贝构造函数说“新构造的对象与原对象共享pData和pRefCount”,这个意思是浅拷贝吗?可是涉及到指针的拷贝不是要用深拷贝嘛

问题一:pRefCount 的内存也是动态分配的;在构造函数里分配;初始值就是1; 记录地址,就是动态分配一块内存,用pRefCount指向就可以;
问题二:可以理解为浅拷贝;
这里是对深拷贝的性能优化,假如不做优化,每次都需要深拷贝,也就是每个对象要有一块矩阵内存,这些对象中,有些会修改矩阵内容,有些不会修改矩阵内容,这会造成内存的浪费;对于这个问题有没有可以优化的呢?
对于不修改的矩阵是不是可以用相同的一块内存呢,这就要解决两个问题:如何知道那些矩阵不修改呢?内存何时释放呢?
我们可以这样做,(1)拷贝时一开始就不分配内存,就用浅拷贝;当需要修改时,如果和别的对象共享内存,那么就脱离共享,给它单独分配内存;这样就解决了问题一;(2) 每块内存增加一个引用计数,这样就可以知道内存有多少对象共享;在脱离共享时,就减1;当没有共享时,就可以释放内存;

这个专业名词就“copy on write”,可以查查看