MST

星途 面试题库

面试题:C++ 类成员初始化默认值设置的复杂场景

假设有一个`Matrix`类表示二维矩阵,包含成员变量`rows`(行数)、`cols`(列数)以及一个动态分配的二维数组`data`用于存储矩阵元素。请写出构造函数,使用初始化列表为`rows`和`cols`设置默认值为3,并初始化`data`使得矩阵的对角线上元素为1,其余元素为0。同时,阐述在这种情况下默认值设置需要注意的内存管理问题。
44.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>

class Matrix {
private:
    int rows;
    int cols;
    int** data;

public:
    Matrix() : rows(3), cols(3) {
        data = new int*[rows];
        for (int i = 0; i < rows; ++i) {
            data[i] = new int[cols];
            for (int j = 0; j < cols; ++j) {
                data[i][j] = (i == j)? 1 : 0;
            }
        }
    }

    ~Matrix() {
        for (int i = 0; i < rows; ++i) {
            delete[] data[i];
        }
        delete[] data;
    }
};

内存管理问题阐述

  1. 动态内存分配:在构造函数中,为data分配了一个二维动态数组。首先为data分配了rows个指针,然后为每个指针分配colsint类型的空间。这种双重动态分配需要确保在对象销毁时正确释放内存,以避免内存泄漏。
  2. 内存释放:在析构函数中,先释放每一行的内存(delete[] data[i]),然后释放data本身(delete[] data)。如果遗漏了任何一个释放步骤,都会导致内存泄漏。特别是如果在分配内存过程中出现异常,需要确保已分配的内存能够正确释放,这通常可以通过智能指针来更好地管理,以简化内存管理并确保异常安全。