构造器安全中的 malloc
malloc within constructor safe?
如果我在类构造函数中使用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 意味着您有两种内存分配技术,以及它们可以交叉交互的两种不同方式。 这是要处理的四种情况,而且您永远无法充分测试它们。
- 从不同线程使用int64的不同字节安全吗
- 如果没有malloc,链表实现将失败
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 虚拟决赛作为安全
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何将元素添加到数组的线程安全函数?
- malloc() 可能出现内存泄漏
- C++中的线程安全删除
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 通过网络、跨平台传递std::变体是否安全
- 在std::thread中,joinable()然后join()线程安全吗
- 使用std::istream::peek()总是安全的吗
- 从值小于256的uint16到uint8的Endian安全转换
- 在c++队列中使用pop和visit实现线程安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 如果通过委托给“malloc”的重载“new[]”分配,“释放”内存是否安全
- Malloc与nogil一起使用安全吗
- 构造器安全中的 malloc
- 任何线程不安全的malloc