C++ playground http://cpp.sh/
C++
C++ 相关的知识
- 1: 命名规范
- 2: Smart Pointers
- 2.1: 为什么需要 Smart Pointers
- 2.2: Smart Pointers 的类型
- 2.3: Smart Pointers 的注意事项
1 - 命名规范
C++ 命名规范
Envoy 采用 Google C++ Style Guide,除此以外,还有一些自定义的编码规范。
文件名
小写字母,下划线(_)分割单词。如:my_useful_class.cc
类型名/方法名
驼峰形式,首字母大写,如:MyExcitingClass AddTableEntry()
变量名
变量采用小写字母,下划线(_)分割单词的命名方式,如: a_local_variable
class 变量会在最后额外加一个下划线,如:a_class_data_member_
2 - Smart Pointers
Smart pointers 可以自动跟踪一个对象的引用次数并管理对象的内存。
Smart pointers 可以自动跟踪 object 的引用次数,并在指针退出其作用域时自动减少引用次数,当引用次数为零时自动删除其对应的内存空间。 Smart Pointer 提供了类似 Java, Golang 语言的内存回收机制,简化了 C++ 的内存管理。
2.1 - 为什么需要 Smart Pointers
Smart pointers 解决的问题,以及其工作原理。
Raw Pointer 的问题
使用 Raw Pointer 来指向通过 new 关键字分配的内存后,必须在代码中使用 delete 关键字来删除内存。如果存在一些异常分支未能删除内存,会导致内存泄露。
例如在下面的程序中,当 x== 45 时,程序直接返回,导致内存泄露。
void my_func()
{
int* valuePtr = new int(15);
int x = 45;
// ...
if (x == 45)
return; // here we have a memory leak, valuePtr is not deleted
// ...
delete valuePtr;
}
int main()
{
}
Smart Pointer 的原理
Smart Pointer 是 C++ 提供的自动回收内存的机制。其原理是利用 destructor 来清理指针指向的内存。由于当一个对象退出其作用域时,其 destructor 一定会被调用到,因此该机制保证了分配的内存一定会得到清理。下面代码中的 SmartPtr 类演示了 Smart Pointer 的工作原理。
#include <iostream>
using namespace std;
class SmartPtr {
int* ptr; // Actual pointer
public:
// Constructor: Refer https:// www.geeksforgeeks.org/g-fact-93/
// for use of explicit keyword
explicit SmartPtr(int* p = NULL) { ptr = p; }
// Destructor
~SmartPtr() {
delete (ptr);
cout << "allocated memory has been deleted"
}
// Overloading dereferencing operator
int& operator*() { return *ptr; }
};
int main()
{
SmartPtr ptr(new int());
*ptr = 20;
cout << *ptr;
// We don't need to call delete ptr: when the object
// ptr goes out of scope, the destructor for it is automatically
// called and destructor does delete ptr.
return 0;
}
参考阅读
2.2 - Smart Pointers 的类型
Smart pointers 包括 unique_prt, shared_ptr, weak_ptr 三种类型。
unique_prt
shared_ptr
weak_ptr
参考阅读
2.3 - Smart Pointers 的注意事项
使用 Smart Pointers 的一些注意事项。