1. Hint: Exceptions
Exceptions are ways to signal that something has gone wrong during run-time. Exceptions are “thrown” and can crash the program, but can be “caught” to avoid this.
Takeaway, there are often more code paths than meets the eye! When writing production code, be sure to have test cases that cover all possible paths(or catch errors that would produce more paths)!
2. RAII
Recoutces that need to be returned after use:
Acquire | Release | |
---|---|---|
Heap memory | new | delete |
Files | open | close |
Locks | try_lock | unlock |
Sockets | socket | close |
How do we guarantee resources get released even if there are exceptions?
RAII: Resource Acquisition Is Initialization.
- All resources used by a class should be acquired in the constructor.
- All resources used by a class should be released in the destructor.
Why? Objects should be usable immediately after creation. There should never be a “half-valid” state of an object, where it exists in memory but is not accessible to/used by the program. The destructor is always called(when the object goes out of scope), so the resource is always freed!
However, ifstream and ofstream are not follow RAII.
1 | void foo() { |
3. Smart Pointers(RAII-safe pointers)
Three types of smart pointers in C++ that automatically free underlying memory when destructed.
std::unique_ptr
: Uniquely owns its resource, can’t be copied.std::shared_ptr
: Can make copies, destructed when underlying memory goes out of scope.std::weak_ptr
: Models temporary ownership: when an object only needs to be accessed if it exists(convert to shared_ptr to access).1
2std::unique_ptr<T> up = std::make_unique<T>();
std::shared_ptr<T> sp = std::make_shared<T>();
4. How are projects built in C++?
What do make and Makefiles do?
- make is a “build system”
- uses g++ as its main engine
- serveral stages to the compiler system
- can be utilized through a Makefile
So why do we use cmake in our assignments?
- cmake is a cross-platform make
- cmake creates build systems!
- It takes in an even higher-level config file, ties in external libraries, and outputs a Makefile, which is then run.
Components of C++’s compilation system.
- Preprocessing: The C/C++ preprocessor handles preprocessor directives, replaces includes(#include) and expands any macros(#define)
- in: cpp files
- out: full cpp files
- Compiling: Preformed on output of the preprocessor. Structure of a compiler includes (1)Lexical(词汇) Analysis; (2)Parsing; (3)Semantic Analysis; (4)Optimization; (5)Code Generation(assembly code).
- in: full cpp files
- out: .s files
- Assembling: Runs on the assembly code as outputted by the compiler. Converts assembly code to binary machine code. Assumes that all functions are defined somewhere without checking.
- in: .s files
- out: .o files
- Linking: Creates a single executable file from multiple object files by combining the pieces of a program, figuring out a memory organization so that all the pieces can fit together, resolving references so that the program can run under the new memory organization.
- in: .o files
- out: executable
- 本文作者: 夏花
- 本文链接: http://xiahua19.github.io/2022/07/27/cs106l-14-RAII-Smart-Pointers-and-C-Project-Building/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!