构造器安全中的 malloc

malloc within constructor safe?

本文关键字:malloc 安全 构造器      更新时间:2023-10-16

如果我在类构造函数中使用malloc(或new/new[](分配内存,那么那位内存不会被覆盖吗?

class stack {
  private:
    int * stackPointer;
  public:
    stack (int size) {
      stackPointer = (int *) malloc (sizeof(int) * stackSize);
    }
    int peek (int pos) {
      return *(stackPointer + pos); //pos < size
    }
}
构造

函数中的malloc/new是安全的,前提是您遵循三法则。使用malloc/new您现在拥有一个资源,您必须明确注意在正确的时间发布。

因此:必须定义复制构造函数、赋值运算符和将free内存的析构函数。如果你不这样做,这个类可能会被滥用并给你带来很多问题。

如果要避免定义这些额外的函数,请改用std::vector,它会为您处理它们。

是的,您使用malloc()分配的任何内存都是安全的。除非被您的代码(无论是故意还是错误(覆盖,否则它不会被覆盖。

从技术上讲,只要您不以任何可能的方式将该内存的句柄传递给外部世界,它就不会被其他人覆盖。这样,您只能将该内存的操作本地化为类成员。

但是,您不能100%确定这一点,因为其他程序员可能会以可能损坏您的内存的方式编写程序。例如,将越界索引传递到数组。

在 C 或 C++ 程序中,没有可写内存可以安全地被覆盖。分配函数建立对内存的声明,程序有责任尊重这些声明。

C++中的语言保护就是语言保护。

如果你正在做一些花哨的C指针游戏,你最终可以找到并覆盖分配的内存。 它被认为与最佳实践完全相反,但它可能会发生。

因此,"保护"很像"隐藏"。 构造函数中的 Malloc 将根据周围类决定允许的公开返回"隐藏"的指针,但它们在"内存屏蔽"或操作系统/硬件平台可能在程序之间施加的其他更昂贵的操作的意义上不受保护。

就"安全"而言,我不建议这样做,主要是因为您有可能不退出构造函数。 如果在构造函数中失败,尝试对可能成功的任何 mallocs 进行适当的内存清理将是一个非常困难的编程来验证它是否正常工作。 请改用new,并将内存放在一个对象中,这样至少在故障情况下,您将只有一种内存分配技术需要担心。

带有C++的 Malloc 意味着您有两种内存分配技术,以及它们可以交叉交互的两种不同方式。 这是要处理的四种情况,而且您永远无法充分测试它们。