如果我在类构造函数中使用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
}
}
答案 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 ++程序中不会覆盖可写内存。分配功能在存储器上建立了一个权利要求,程序有责任尊重这些权利要求。