#include
#include
using namespace std;
main()
{
string str1 = "hello world";
string str2 = str1;
printf ("Sharing the memory:/n");
printf ("/tstr1's address: %x/n", str1.c_str() );
printf ("/tstr2's address: %x/n", str2.c_str() );
str1[1]='q';
str2[1]='w';
printf ("After Copy-On-Write:/n");
printf ("/tstr1's address: %x/n", str1.c_str() );
printf ("/tstr2's address: %x/n", str2.c_str() );
return 0;
} |
> g++ -o stringTest stringTest.cpp
> ./stringTest
Sharing the memory:
str1's address: 343be9
str2's address: 343be9
After Copy-On-Write:
str1's address: 3407a9
str2's address: 343be9 |
唠叨几句:
1)构造和赋值的差别
对于前面那个例程中的这两句:
string str1 = "hello world";
string str2 = str1;
不要以为有“=”就是赋值操作,其实,这两条语句等价于:
string str1 ("hello world"); //
调用的是构造函数
string str2 (str1); //
调用的是拷贝构造函数
如果str2是下面的这样情况:
string str2; //
调用参数默认为空串的构造函数:
string str2(“”);
str2 = str1; //
调用
str2
的赋值操作:
str2.operator=(str1);
2) 另一种情况
char tmp[]=”hello world”;
string str1 = tmp;
string str2 = tmp;
这种情况下会触发内存的共享吗?想当然的,应该要共享。可是根据我们前面所说的共享内存的情况,两个string类的声明和初始语句并不符合我前述的两种情况,所以其并不发生内存共享。而且,C++现有特性也无法让我们做到对这种情况进行类的内存共享。
|
If ( RefCnt>0 ) {
char* tmp = (char*) malloc(strlen(_Ptr)+1);
strcpy(tmp, _Ptr);
_Ptr = tmp;
}
|
string h1 = “hello”;
string h2= h1;
string h3;
h3 = h2;
string w1 = “world”;
string w2(“”);
w2=w1;
|
//
构造函数(分存内存)
string::string(const char* tmp)
{
_Len = strlen(tmp);
_Ptr = new char[_Len+1+1];
strcpy( _Ptr, tmp );
_Ptr[_Len+1]=0; //
设置引用计数
}
//
拷贝构造(共享内存)
string::string(const string& str)
{
if (*this != str){
this->_Ptr = str.c_str(); //
共享内存
this->_Len = str.szie();
this->_Ptr[_Len+1] ++; //
引用计数加一
}
}
//
写时才拷贝
Copy-On-Write
char& string::operator[](unsigned int idx)
{
if (idx > _Len || _Ptr == 0 ) {
static char nullchar = 0;
return nullchar;
}
_Ptr[_Len+1]--; //
引用计数减一
char* tmp = new char[_Len+1+1];
strncpy( tmp, _Ptr, _Len+1);
_Ptr = tmp;
_Ptr[_Len+1]=0; //
设置新的共享内存的引用计数
return _Ptr[idx];
}
//
析构函数的一些处理
~string()
{
_Ptr[_Len+1]--; //
引用计数减一
// 引用计数为0时,释放内存
if (_Ptr[_Len+1]==0) {
delete[] _Ptr;
}
} |
string GetIPAddress(string hostname)
{
static string ip;
……
……
return ip;
}
|
main()
{
//
载入动态链接库中的函数
hDll = LoadLibraray(…..);
pFun = GetModule(hDll, “GetIPAddress”);
//
调用动态链接库中的函数
string ip = (*pFun)(“host1”);
……
……
//
释放动态链接库
FreeLibrary(hDll);
……
cout << ip << endl;
}
|
(版权所有,转载时请注明作者和出处)
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=24077