c++空指针导致程序崩溃
- 空指针可以是普通指针,也可以是智能指针。
- 在C++中,空指针访问通常会导致未定义行为,而不是抛出异常。C++标准库并不包含空指针访问时的异常处理机制,所以,空指针只能通过判空处理而不是异常捕获。
判空的错误写法
原因:如果是指针(或智能指针)对象是在多线程使用读写,这么写很容易引发崩溃,因为执行*pInt = 200;时判空可能已经不管用了。最好写完整的if else
std::unique_ptr<int> pInt = std::make_unique<int>(100);
{
pInt.reset(nullptr); //pInt = nullptr;
//不严谨的写法
if (!pInt) return;//不严谨
*pInt = 200;//不严谨
//正确的写法
if (!pInt)
return;
else
*pInt = 200;
}
多线程下,指针(或智能指针)的严谨使用方法
前提:如果多线程下,指针所指向的对象都有读写操作,那么我们不必纠结指针的判空条件如何严谨,而是需要考虑数据竞争和同步问题。常见的处理是std::mutex + std::lock_guard
在读写操作之前,加锁保护。读的时候,在判空之前加锁即可。