构造函数内的 malloc 安全吗?

3

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

“is that bit of memory safe from being overwritten?” 的意思是“这个内存位是否安全,不会被覆盖?” - Borgleader
7
不正确。动态分配的内存不会超出其范围。你可能将其与返回指向本地变量的指针混淆了。 - interjay
2
它还算安全(我们没有看到你的其他方法)- 但不要这样做,使用std::vector<int>,那是安全、简单和被广泛理解的。 - pm100
@interjay 是的,抱歉我是指本地变量,例如 char str[9] = malloc (9); return str; - texasflood
@texasflood 这甚至无法编译。不允许的是:char str[9] = "wrong"; return str; 这里没有使用 malloc。 - interjay
显示剩余3条评论
5个回答

9
在构造函数中使用malloc/new是安全的,前提是你遵循三法则。使用malloc/new后,你现在有一个资源,必须明确地在正确的时间释放它。
因此:你必须定义拷贝构造函数、赋值运算符和析构函数,以便free内存。如果不这样做,则可能会误用类并导致许多问题。
如果你想避免定义这些额外的函数,请改用std::vector,它会为你处理这些问题。

您不一定需要定义复制构造函数和赋值运算符。如果您不需要将类复制,删除它们是使类安全的最简单方法。 - Mike Seymour

1

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


0

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

如果你在进行一些花哨的C指针游戏,最终可能会找到并覆盖已分配的内存。虽然这被认为是最佳实践的完全相反,但它确实可能发生。

因此,“保护”就像“隐藏”一样。在构造函数中使用Malloc将返回基于周围类决定允许的曝光度而“隐藏”的指针,但它们并没有受到“内存栅栏”或操作系统/硬件平台可能在程序之间强制执行的其他更昂贵的操作的保护。

至于它是否“安全”,我不建议这种做法,主要是因为你有可能不会退出构造函数。如果在构造函数中失败,尝试对任何可能成功的malloc进行适当的内存清理将是一个非常难以编程验证其是否正确工作的问题。使用new代替,并将内存放入对象中,这样在失败情况下,您将只需要担心一种内存分配技术。

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


0

从技术上讲,只要您不以任何可能的方式将句柄传递给外部世界,那么它就是安全的,不会被其他人覆盖。这样,您就可以将该内存的操作局限于类成员中。

但是,您无法百分之百地确定其他程序员是否会以可能破坏您内存的方式编写程序,例如向数组传递超出边界的索引。


0
在 C 或 C++ 程序中,没有可写内存是绝对安全的。分配函数会对内存进行管理,并由程序负责尊重这些管理要求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接