首页 > 后端开发 > C++ > 在 C 中动态分配对象数组时如何避免内存问题?

在 C 中动态分配对象数组时如何避免内存问题?

Patricia Arquette
发布: 2024-12-18 06:52:17
原创
675 人浏览过

How to Avoid Memory Issues When Dynamically Allocating an Array of Objects in C  ?

动态分配对象数组

使用包含动态分配数组的对象时,创建这些对象的整个数组可能会带来挑战。使用像这样的简单方法:

A* arrayOfAs = new A[5];
for (int i = 0; i < 5; ++i) {
    arrayOfAs[i] = A(3);
}
登录后复制

会导致内存问题,因为循环中破坏的 A 对象会删除其内部 myArray 数组,从而使 arrayOfAs 的数组元素无效。

要避免这些问题问题,理解“4 规则”(或 C 11 中扩展的“5 规则”)对于包含 raw 的类至关重要指针:

  1. 构造函数
  2. 析构函数
  3. 复制构造函数
  4. 赋值运算符
  5. 移动构造函数(C 11)
  6. 移动作业 (C 11)

如果没有定义,编译器会生成这些方法自己的版本,可能不适合原始指针。

要解决上述错误,最低要求为包含指向数组的指针的类包括:

class A {
    size_t mSize;
    int* mArray;
public:
    A(size_t s = 0) {mSize=s;mArray = new int[mSize];}
    ~A() {delete [] mArray;}

    A(A const& copy) {
        mSize = copy.mSize;
        mArray = new int[copy.mSize];
        // Handle copying of integers/other members
    }

    A& operator=(A other) {
        std::swap(mArray, other.mArray);
        std::swap(mSize, other.mSize);
        return *this;
    }
};
登录后复制

或者,使用 std::vector 等标准容器可以简化过程,因为它们处理内存自动管理:

class A {
    std::vector<int> mArray;
public:
    A(){}
    A(size_t s) :mArray(s)  {}
};
登录后复制

以上是在 C 中动态分配对象数组时如何避免内存问题?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板