Skip to content

Commit 4ab9bed

Browse files
committed
update C++
1 parent 709d66f commit 4ab9bed

File tree

7 files changed

+41
-15
lines changed

7 files changed

+41
-15
lines changed

C++/11_SmartPoint.md

+10-3
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ int main()
5353
cout<<*up3<<endl;
5454
// cout<<*up1<<endl; // 运行时错误
5555

56-
up3.reset(); // 显示释放内存
56+
up3.reset(); // 显式释放内存
5757
up1.reset(); // 即使up1没有拥有任何内存,但是这样调用也没有问题
5858
// cout<<*up3<<endl; // 已经释放掉up3了,这样会运行时错误
5959

@@ -119,7 +119,6 @@ shared_ptr名如其名,它允许多个该智能指针共享地“拥有”同
119119
### shared_ptr 指向数组
120120

在默认情况下,shared_ptr将调用delete进行内存的释放;当分配内存时使用new[]时,我们需要对应的调用delete[]来释放内存;为了能正确的使用shared_ptr指向一个数组,我们需要定制一个删除函数,例如:
121121

122-
123122
```c++
124123
#include <iostream>
125124
#include <memory>
@@ -217,6 +216,10 @@ int main() {
217216
}
218217
```
219218

219+
这里的 lock() 用来取得 weak_ptr 对应的 shared_ptr。
220+
221+
> Creates a new std::shared_ptr that shares ownership of the managed object. If there is no managed object, i.e. *this is empty, then the returned shared_ptr also is empty.
222+
220223
# 智能指针实现
221224

222225
智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。
@@ -339,7 +342,11 @@ int main()
339342
[从auto_ptr说起](http://www.jellythink.com/archives/673)
340343
[到C++11中的智能指针](http://www.jellythink.com/archives/684)
341344
[C++11 新特性之智能指针](http://blog.jobbole.com/104569/)
342-
[When is std::weak_ptr useful?](http://stackoverflow.com/questions/12030650/when-is-stdweak-ptr-useful)
345+
[When is std::weak_ptr useful?](http://stackoverflow.com/questions/12030650/when-is-stdweak-ptr-useful)
346+
347+
[shared_ptr 是否线程安全?](http://beamnote.com/2014/is-shared_ptr-thread-safe.html)
348+
[boost::shared_ptr class template](http://www.boost.org/doc/libs/1_55_0/libs/smart_ptr/shared_ptr.htm#ThreadSafety)
349+
343350

344351
[1]: http://7xrlu9.com1.z0.glb.clouddn.com/C++_11_SmartPoint_1.png
345352
[2]: http://7xrlu9.com1.z0.glb.clouddn.com/C++_11_SmartPoint_2.png

C++/Basic.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ struct 或者 union 成员对齐规则如下:
224224
1. 第一个数据成员放在offset为0的地方,每个成员按照对齐系数和自身占用字节数中,二者比较小的那个进行对齐;
225225
2. 在数据成员完成各自对齐以后,struct或者union本身也要进行对齐,对齐将按照对齐系数和struct或者union中最大数据成员长度中比较小的那个进行;
226226

227-
先局部成员对齐,然后再全局对齐。([memory_align.cpp](C++_Code/memory_align.cpp))此外,值得注意的是,**enum 内部是 int 实现的,所以大小为 4。用 typedef 声明指针时,并不为指针分配空间**
227+
先局部成员对齐,然后再全局对齐。([memory_align.cpp](../Coding/C++_Memory_Align.cpp))此外,值得注意的是,**enum 内部是 int 实现的,所以大小为 4。用 typedef 声明指针时,并不为指针分配空间**
228228

229229
[enum,typedef声明指针](http://www.nowcoder.com/questionTerminal/f12da06f01594f4d8d04a1f242399dc5)
230230
[结构体中 : 的含义](http://www.nowcoder.com/questionTerminal/f4e20747a2dd4649bac0c028daa234f4)
@@ -268,7 +268,7 @@ static_cast 很像 C 语言中的旧式类型转换。可以用于以下场景
268268
* 用于在存有继承关系的类之间的指针或引用的转换(即可将基类转换为子类,也可将子类转换为基类),把派生类的指针或引用转换成基类时是安全的;把基类指针或引用转换成派生类表示时,由于没有类型检查,所以是不安全的。
269269
* 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。
270270
* 把任何类型的表达式转换成void类型。
271-
* 还能将 non-const对象转换为 const对象(注意:反之则不行,那是const_cast的职责)。
271+
* 还能将 non-const 对象转换为 const对象(注意:反之则不行,那是const_cast的职责)。
272272

273273
如下示例:
274274

@@ -289,7 +289,7 @@ CDerived *derived = static_cast<CDerived *>(base);
289289
290290
dynamic_cast 主要用来在继承体系中的**安全向下转型**。它能安全地将指向基类的指针转型为指向子类的指针或引用,并获知转型动作成功是否。
291291
292-
dynamic_cast 只能用在指针和引用类型的转换中,它是唯一进行运行期(runtime)检查的类型转换符,它的主要目的就是保证转换后的类型是一个完整类型(Complete type)。dynamic_cast在转换指针类型时,如果结果不是一个Complete Type, 它会返回NULL; dynamic_cast在转换引用类型时,如果结果不是一个Complete Type,它会抛出bad_cast的异常。dynamic_cast 会动用运行时信息(RTTI)来进行类型安全检查,因此 dynamic_cast 存在一定的效率损失。
292+
**dynamic_cast 只能用在指针和引用类型的转换中**,它是唯一进行运行期(runtime)检查的类型转换符,它的主要目的就是保证转换后的类型是一个完整类型(Complete type)。dynamic_cast在转换指针类型时,如果结果不是一个Complete Type, 它会返回NULL; dynamic_cast在转换引用类型时,如果结果不是一个Complete Type,它会抛出bad_cast的异常。dynamic_cast 会动用运行时信息(RTTI)来进行类型安全检查,因此 dynamic_cast 存在一定的效率损失。
293293
294294
```c++
295295
class CBase { };
File renamed without changes.

Linux_OS/FileSystem.md

+15-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
虽然上面给出了结构化的表述,但实际上关于文件并无严格的定义。通常在操作系统中将程序和数据组织成文件。文件可以是数字、字母或二进制代码,基本访问单元可以是字节、行或记录。文件可以长期存储于硬盘或其他二级存储器中,允许可控制的进程间共享访问,能够被组织成复杂的结构。
88

9-
## 文件的属性
9+
## 文件属性
1010

1111
文件有一定的属性,这根据系统的不同而有所不同,但是通常都包括如下属性:
1212

@@ -31,6 +31,20 @@
3131

3232
这6个基本操作可以组合执行其他文件操作。例如,一个文件的复制,可以创建新文件、 从旧文件读出并写入到新文件。
3333

34+
## 文件类型
35+
36+
Linux的文件类型有以下几种:
37+
38+
| 文件类型 | ls -l 显示 |
39+
| ------ | -----|
40+
|普通文件 | - |
41+
|目录 | d |
42+
|符号链接 | l |
43+
|字符设备 | c |
44+
|块设备 | b |
45+
|套接字 | s |
46+
|命名管道 | p |
47+
3448
# 共享文件
3549

3650
文件共享使多个用户(进程)共享同一份文件,系统中只需保留该文件的一份副本。如果系统不能提供共享功能,那么每个需要该文件的用户都要有各自的副本,会造成对存储空间的极大浪费。为解决文件的共享使用,Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)。

Linux_OS/StackHeap.md

+1
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
* 分配效率:计算机在底层对栈提供支持,分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,效率比栈要低得多。
7474

7575
# 更多阅读
76+
7677
[Linux内存管理](http://www.kerneltravel.net/journal/v/mem.htm)
7778
[什么是堆和栈,它们在哪儿?](http://blog.jobbole.com/75321)
7879
[What and where are the stack and heap?](http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap)

Network/TCP.md

+4
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,10 @@ ssthresh = cwnd
246246
[TCP 的那些事儿(上)](http://coolshell.cn/articles/11564.html)
247247
[TCP 的那些事儿(下)](http://coolshell.cn/articles/11609.html)
248248

249+
[TCP keepalive overview](http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html)
250+
[Detection of Half-Open (Dropped) Connections](http://blog.stephencleary.com/2009/05/detection-of-half-open-dropped.html)
251+
252+
249253
[1]: http://7xrlu9.com1.z0.glb.clouddn.com/Network_TCP_1.png
250254
[2]: http://7xrlu9.com1.z0.glb.clouddn.com/Network_TCP_2.png
251255
[3]: http://7xrlu9.com1.z0.glb.clouddn.com/Network_TCP_3.png

Questions.md

+8-8
Original file line numberDiff line numberDiff line change
@@ -66,18 +66,18 @@
6666
- [ ] [类内初始化](C++/Class.md#构造函数初始值列表)
6767
- [ ] [虚函数实现机制](C++/Class.md#多态)
6868
- [ ] [函数重载、覆盖、隐藏区别](C++/Class.md#成员函数)
69-
- [ ] 数组作为形参
70-
- [ ] 指针与引用区别
71-
- [ ] 函数指针
69+
- [ ] [数组作为形参](C++/README.md#数组形参)
70+
- [ ] [指针与引用区别](C++/Pointer.md#指针与引用)
71+
- [ ] [函数指针](C++/Pointer.md#函数指针)
7272
- [ ] [内存对齐原则](C++/Basic.md#内存对齐)
7373
- [ ] [sizeof 运算符](C++/Basic.md#sizeof-运算符)
7474
- [ ] [union 实现 CPU 字节序判定](C++/Basic.md#联合体cpu字节序)
75-
- [ ] 内存堆栈的区别
76-
- [ ] 常见的内存错误
77-
- [ ] new 和 malloc 区别
75+
- [ ] [内存堆栈的区别](Linux_OS/StackHeap.md)
76+
- [ ] [常见的内存错误](C++/Memory.md#常见的内存错误)
77+
- [ ] [new 和 malloc 区别](C++/Memory.md#new-和-malloc-的对比)
7878
- [ ] [四种类型转换方式](C++/Basic.md#类型转换)
79-
- [ ] include 头文件方式
80-
- [ ] 按值传递和按引用传递区别
79+
- [ ] [include 头文件包含](C++/Compiler.md#文件包含)
80+
- [ ] [按值传递和按引用传递区别](C++/Function#函数参数)
8181
- [ ] [If 判断规范写法](C++/Basic.md#if-判断语句)
8282
- [ ] [逗号运算符](C++/Basic.md#逗号运算符)
8383
- [ ] [智能指针](C++/11_SmartPoint.md)

0 commit comments

Comments
 (0)