我试图了解async与使用线程到底有什么不同。在概念层面上,我认为多线程根据定义是异步的,因为您正在线程之间进行 I/O 等上下文切换。
但似乎即使对于单线程应用程序之类的实例,仅添加线程也与使用async. 例如:
#include <iostream> // std::cout
#include <future> // std::async, std::future
// a non-optimized way of checking for prime numbers:
bool is_prime (int x) {
std::cout << "Calculating. Please, wait...\n";
for (int i=2; i<x; ++i) if (x%i==0) return false;
return true;
}
int main ()
{
// call is_prime(313222313) asynchronously:
std::future<bool> fut = std::async (is_prime,313222313);
std::cout << "Checking whether 313222313 is prime.\n";
// ...
bool ret = fut.get(); // waits for is_prime to …Run Code Online (Sandbox Code Playgroud) 据我了解,C++ 编译器会自动尝试删除超出范围的对象。然而,在这个记录悬空指针情况的SO 帖子中,有一个char数组被自动清除但没有delete操作:
char *func()
{
char str[10];
strcpy(str, "Hello!");
return str;
}
Run Code Online (Sandbox Code Playgroud)
这显然会返回一个悬空指针,因为内存将在作用域之后被释放。但是,如果我没有指定,这怎么可能delete?就我而言,这个网站显示了我认为在类似情况下会发生的情况:
#include <iostream>
using namespace std;
void oil_leak() {
//allocate 8 bytes from heap
double *pointer = new double(32.54);
}
int main() {
oil_leak();
}
Run Code Online (Sandbox Code Playgroud)
即,为指针分配的内存在作用域之后没有释放,导致内存泄漏。