C++中论在类中成员变量定义顺序的重要性

1.问题引入以及段错误介绍

今天,我在运行代码的时候,突然报出了一个错误,那就是Segmentation fault (core dumped) ,也就是段错误(核心转储)。

相信大家大多碰见过这个错误。

段错误(SIGSEGV)是程序试图访问非法内存地址时,操作系统强制终止程序并生成的崩溃报告。它通常意味着你的代码存在以下问题:

  1. 空指针 / 野指针访问 :解引用了一个 nullptr,或者访问了已经释放的内存。
  2. 数组越界:访问了超出数组 / 缓冲区范围的内存。
  3. 栈溢出:函数调用过深,或在栈上分配了过大的局部变量。
  4. 多线程内存冲突:多个线程同时修改同一块未加锁保护的数据。

2.类的成员变量初始化而导致出现段错误

使用gdb调试后,我才发现原来是一个数组越界访问,知道运行到该数组在构造函数初始化的时候,我才发现竟然是我的成员变量定义顺序 有错而导致的(该问题我之前见过,但是此次遇到了才写一篇警醒)。

我们来看一下下面这个代码

cpp 复制代码
#include <iostream>
#include <memory>  // 智能指针头文件
using namespace std;

class SmartArray {
private:
    // 错误的定义顺序:数组先定义,大小后定义
    unique_ptr<int[]> arr;  // 1. 先初始化
    int arr_size;           // 2. 后初始化

public:
    // 初始化列表书写顺序不影响实际初始化顺序!
    SmartArray(int size)
        : arr_size(size),          // 书写顺序第一,但实际第二执行
          arr(make_unique<int[]>(arr_size))  // 书写顺序第二,但实际第一执行
    {}

    void fill() {
        for (int i = 0; i < arr_size; ++i) {
            arr[i] = i * 10;  // 段错误!arr 是大小为 0 的数组
        }
    }

    void print() {
        for (int i = 0; i < arr_size; ++i) {
            cout << arr[i] << " ";
        }
        cout << endl;
    }
};

int main() {
    SmartArray obj(5);
    obj.fill();  // 代码会崩溃
    return 0;
}

这个代码就是典型的成员变量顺序定义错误,由于我们在析构的时候,如果我们用SmartArry():这种格式初始化我们的成员变量,我们执行顺序并不是按照这里面的书写顺序,而是按照我们的成员变量定义顺序

3.此问题后,我们的结论。

对于我们要在一个类中定义一个数组,且定义一个数组大小的变量,那么我们一定要把数组大小的成员变量先定义在数组前面

相关推荐
孙克旭_12 分钟前
单链表进阶实操:5 道常考面试题详细解析【Java 实现】
java·开发语言·数据结构·单链表
Titan202414 分钟前
HTTPS基础知识梳理
服务器·网络·c++·网络协议·学习·http·https
艾莉丝努力练剑16 分钟前
【AI大模型接入SDK】SSE协议
c++·学习·面试·大模型·sdk
斑马13917 分钟前
Linux软件编程学习笔记(五)——线程
开发语言·php
吴声子夜歌23 分钟前
Java——数组和集合(一)
java·开发语言
呆呆敲代码的小Y31 分钟前
Lua 上值(UpValue)
开发语言·junit·lua·lua上值·upvalue
郝学胜_神的一滴34 分钟前
C++11 工程级应用 06:自己造一个类似Python的Range迭代器
c++·后端
呆呆敲代码的小Y35 分钟前
【游戏开发】C# 中的迭代器
java·开发语言·c#·迭代器
benchmark_cc37 分钟前
K 线数据断层会对回测造成什么影响?从一个缺失交易日看懂量化策略为什么会失真
大数据·开发语言·数据分析·量化·股票数据·quantdash·量化数据源
benchmark_cc42 分钟前
数据 API 稳定性为什么会影响量化策略?从数据获取到信号执行的完整分析
开发语言·python·数据分析·量化·股票数据·quantdash·量化数据源