【C++】零散知识

1、抛异常时,还会执行析构操作吗?

发生异常(抛异常)时,在该作用域中的局部非PAD变量(即,有构造函数和析构函数的变量)会执行析构操作。

2、new出的内存一定在堆上吗?

new是C++中操作符,如果通过重载操作符,改用其他内存来实现内存分配,例如全局变量做的对象池,new出的内存就不在堆上了;
new/delete是C++关键字,需要编译器的支持,如果编译器将new的内存分配到其他位置,也就不在堆上了。

3、delete NULL会报错吗?

C++标准规定,delete (void*)0;是安全的,而 NULL即0(#define NULL 0)。

这里真正要注意的是:在delete后,将该指针赋值为NULL,防止多次delete该指针

4、RAII是什么?

RAII是利用1、抛异常时,还会执行析构操作吗? ,C++保证了所有栈对象在生命周期结束时会被销毁(即调用析构函数)来实现。
就是在析构函数中实现:释放内存、关闭文件描述符等操作。
典型用法std::lock_guard:

std::mutex mtx;
std::lock_guard<std::mutex> guard(mtx);

std::lock_guard的实现

template <class Mutex> class lock_guard {
private:
    Mutex& mutex_;

public:
    lock_guard(Mutex& mutex) : mutex_(mutex) { mutex_.lock(); }
    ~lock_guard() { mutex_.unlock(); }

    lock_guard(lock_guard const&) = delete;
    lock_guard& operator=(lock_guard const&) = delete;
};

下面是它的专业解释:bolabola…
RAII,全称资源获取即初始化(英语:Resource Acquisition Is Initialization),它是在一些面向对象语言中的一种惯用法。RAII源于C++,在Java,C#,D,Ada,Vala和Rust中也有应用。
RAII要求,资源的有效期与持有资源的对象的生命期严格绑定,即由对象的构造函数完成资源的分配(获取),同时由析构函数完成资源的释放。在这种要求下,只要对象能正确地析构,就不会出现资源泄露问题。

5、C++编译报错:iostream no such file or directory

原因分析:C++项目中使用了.c文件,有时会报这个错误,本人遇到的情况和预编译头文件有关
解决方法:将.c 文件改为.cpp文件。

6、预编译头文件

预编译头文件是被很多编译器用来编译稳定的代码以及将编译好的稳定代码存储在二进制文件中用于提升编译性能。在随后的编译中,编译器将加载存储状态继续编译指定的文件。每一个随后的编译将更快,因为稳定的代码不需要再次编译。
预编译头文件应该将稳定和静态(例如,Qt库头文件、第三方库头文件、自定义的不经常改动的头文件)的代码包含在预编译头文件中。

例如在Qt项目中使用预编译头文件,在工程文件pro中添加:

CONFIG += precompile_header
PRECOMPILED_HEADER = $$PWD/precompiled.h

precompiled.h的内容如下:

// Add C includes here
// ------ C includes------

#if defined __cplusplus

// Add C++ includes here
#include <stdlib>
#include <iostream>
#include <vector>
#include <QApplication>

// Qt includes
#include <QPushButton>
#include <QLabel>
#include "thirdparty/include/libmain.h"
#include "my_stable_class.h"

#endif

注意:预编译头文件要将C和C++头文件分开,因为预编译头文件用于C文件时,不能不包含C++代码。(本人也不理解这句话)
一种解释:https://stackoverflow.com/questions/47695339/iostream-file-not-found-error-when-compiling-a-precompile-header-in-xcode

You should modify the pch with #ifdef preprocessor directives:

#ifdef __cplusplus
#include <cstdio>
#include <iostream>
#endif

#ifdef __OBJC__
#import <Foundation/Foundation.h>
#enif

(I just ran into this problem and solved it in this way.)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭老二

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值