构造函数中的malloc安全吗?

时间:2014-12-15 17:18:48

标签: c++

如果我在类构造函数中使用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
    }
}

5 个答案:

答案 0 :(得分:9)

构造函数中的

malloc / new是安全的,如果您遵循三个规则。使用malloc / new,您现在拥有一个必须明确注意在适当时间发布的资源。

因此:您必须定义一个复制构造函数,赋值运算符和将free内存的析构函数。如果你不这样做,那么这个课程就会被滥用并导致很多问题。

如果您想避免必须定义这些额外功能,请使用std::vector代替它,为您处理它们。

答案 1 :(得分:1)

是的,您使用malloc()分配的任何内存都是安全的。除了你的代码(无论是有意还是来自bug),它都不会被覆盖。

答案 2 :(得分:0)

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

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

因此,&#34;保护&#34;很像&#34;隐藏&#34;。构造函数中的malloc将返回隐藏&#34;隐藏的指针。根据周围阶级决定允许的暴露程度,但它们在“记忆围栏”的意义上不受保护。或者操作系统/硬件平台可能在程序之间施加的其他更昂贵的操作。

就安全而言,我不推荐这种做法,主要是因为你有可能不退出构造函数。如果在构造函数中失败,尝试对可能成功的任何malloc进行适当的内存清理将是一个非常难以编程的程序,以验证它是否正常工作。改为使用new,并将内存放在一个对象中,至少在失败的情况下,你只需要一种内存分配技术。

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

答案 3 :(得分:0)

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

然而,你无法100%确定,因为其他程序员可能以一种可能破坏你的内存的方式编写程序。例如,将绑定索引传递给数组。

答案 4 :(得分:0)

在C或C ++程序中不会覆盖可写内存。分配功能在存储器上建立了一个权利要求,程序有责任尊重这些权利要求。