拷贝构造函数和TIME_WAIT状态的意义

来源:互联网 发布:歌华网络 编辑:程序博客网 时间:2024/05/19 19:32

/************深拷贝 浅拷贝***********/
c++默认拷贝构造函数是浅拷贝,
因此要实现深拷贝我们需要重新写,


防止默认拷贝发生 因为默认拷贝构造函数 会造成赋值等操作 调用默认拷贝,
但是只是执行了浅拷贝,所以导致程序结束,调用析构函数释放空间的时候
会释放两次。这就出问题了
所以要么禁用默认拷贝构造函数
要么自己重写拷贝构造函数


默认拷贝构造函数 不处理静态对象 static
也不处理 new的那些指针对象 并没有单独的空间 只是指向一个地方 所以析构的时候出了问题


#define  DISALLOW_COPY_AND_ASSIGN(TypeName) \

TypeName(const TypeName&); \
TypeName& operator=(const TypeName&)


class Rect
{
public:

Rect() { p = new int(100); }

//没有这两个的话 程序最后会崩溃,p指向的空间释放了两次

Rect(const Rect& r) 

p = new int; 
*p = *(r.p);
width = r.width;
height = r.height;
}
Rect& operator=(const Rect& r)
{
p = new int;
*p = *(r.p);
width = r.width;
height = r.height;
}
~Rect() { delete p; }

private:

//或者使用这个 禁掉默认拷贝构造函数

//DISALLOW_COPY_AND_ASSIGN(Rect);

private:
int* p;
int width;
int height;

};

int main()

{

Rect r1;
Rect r2 = r1;
Rect r3(r1);

}


/************TCP***********/
常用的TCP选项
mss 1500 1460 最大分节 本连接接每个TCP分节中愿意接受的最大数据量
滑动窗口 拥塞控制 SO_RCVBUF 一般最大65535 16位 卫星通信等可以更大 提高吞吐量
时间戳 高速连接 失而复现分组可能造成的数据破坏

TIME_WAIT状态会维持2个msl 存在理由何在
讲道理直接结束不是完了 为何还要维护这个状态,
1 因为它是主动断开的,最后一个ack是由它发的,如果这个丢了,它也直接关掉了,
那么对端就收不到这个最后一个ack,就算异常 rst了
2 等TIME_WAIT完了后才能重新建立连接,否则,重新连接,上次的报文还在路上,
新连接已经建立,误以为老的报文是新连接的数据。这就不对了

原创粉丝点击