Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@
* [C++结构体内存对齐](./problems/C++结构体内存对齐.md)
* [讲一讲C++中的原子操作有那些?](./problems/讲一讲C++中的原子操作有那些?.md)
* [简单说说STL中的优先级队列是如何实现的?](./problems/简单说说STL中的优先级队列是如何实现的?.md)
* [C++中动态链接库和静态连接库的区别是什么?](./problems/C++中动态链接库和静态连接库的区别是什么?.md)
* [在C++中,对一个对象先malloc后delete这样使用可以吗?有什么风险?](./problems/在C++中,对一个对象先malloc后delete这样使用可以吗?有什么风险?.md)

# 数据结构与算法

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
### 1. 链接时期

- **静态链接库**:在程序编译时,静态库的内容会被复制到最终的可执行文件中。当你运行程序时,不需要库文件,因为所有的功能都已经包含在可执行文件里了。
- **动态链接库**:程序在编译时并不复制库中的代码,而是在程序运行时加载库文件。这意味着库文件必须在程序运行时可用。

### 2. 文件大小

- **静态链接库**通常会导致较大的可执行文件大小,因为所有使用的库代码都被复制进去了。
- **动态链接库**允许可执行文件小一些,因为代码是在运行时才被加载。

### 3. 内存占用

- **静态链接库**的缺点是如果有多个程序使用相同的库,每个程序都有自己的副本,这将导致内存的浪费。
- **动态链接库**可以由多个正在运行的程序共享,只需在内存中有一个副本即可。

### 4. 分发和更新

- **静态链接库**使得更新库变得复杂,因为每个应用都有自己的副本,所以每个应用都需要重新编译和分发。
- 使用**动态链接库**时,只需替换库文件并且确保API兼容性,所有使用该库的应用程序就可以直接利用新版本的库,无须重新编译。

### 5. 跨平台兼容性

- **静态链接库**生成的可执行文件更易于在没有安装相应库的不同系统上运行,因为它们包括了所有需要的代码。
- 对于**动态链接库**,需要确保目标系统上存在正确版本的库文件。

### 6. 链接错误和冲突

- **静态链接库**可能会引起版本冲突问题,尤其是当不同的库依赖同一个库但又各自静态链接了不同版本时。
- **动态链接库**可以减少这种冲突,因为同一份库文件被所有依赖它的程序共享。
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
不可以

风险如下:

1. 构造函数未被调用:使用 `malloc` 分配内存时,对象的构造函数不会被执行,导致对象可能处于未初始化的状态。
2. 析构函数问题:如果你使用 `malloc` 分配而后使用 `delete` 释放内存,会尝试调用对象的析构函数,但因为构造函数从未被调用过,这可能导致未定义行为,比如资源泄露、崩溃或数据损坏等问题。
3. 兼容性问题:`malloc` 和 `delete` 内部实现可能有差异,混用可能导致堆损坏。
4. 异常安全性:由于 `malloc` 和 `delete` 的异常处理机制不同(`new` 可以抛出异常,而 `malloc` 返回NULL),这会进一步使得代码难以维护,并可能导致错误处理不当。