何时使用alloca为类成员释放内存
When is memory allocated using alloca freed for class members?
class MyString
{
public:
MyString(int length):_ptr(alloca(length))
{
}
//Copy Constructor, destructor, other member functions.
private:
void* _ptr;
};
int main()
{
MyString str(44);
return 0;
}
是在main函数结束时释放,还是在构造函数执行后立即释放?这是一个好主意,有一个像这样的字符串类,如果上面的代码工作如预期?
更新:
看起来主要的危险是
- StackOverflow
- 构造函数内联
我想我可以通过使用alloca小尺寸和malloc/free大尺寸来照顾StackOverflow。我猜一定有一些非可移植编译器特定的方式来强制编译器内联。
我很感兴趣,因为字符串类在任何c++项目中都被广泛使用。如果我做对了,我期待着一个巨大的性能提升,因为大多数分配都在堆栈内,否则会进入堆。这将是一个实用程序,最终用户将不知道内部。
根据alloca的文档,当alloca的调用者返回时释放内存。因此,如果编译器将初始化列表视为构造函数的一部分,则在构造函数结束时释放内存,即在执行初始化列表之前创建堆栈帧。如果堆栈帧是在初始化列表执行之后创建的,那么分配的内存将在构造函数的调用者中,因此,在这种情况下,内存在main结束时被释放。我不太了解这个标准,不能绝对确定它会以哪种方式发生。
但是,无论何时释放内存,ptr
的值都不会改变。
显然,类成员的初始化是作为c'tor的一部分执行的。因此,至少按照标准,alloca
返回的指针的有效性被限制为c'tor。
所以像你这样初始化你的类成员似乎是一个非常糟糕的主意。
OTOH以下将没有问题:
class MyString
{
public:
MyString(void* ptr):_ptr(ptr)
{
}
//Copy Constructor, destructor, other member functions.
private:
void* _ptr;
};
int main()
{
MyString str(alloca(44));
return 0;
}
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++ 在具有数组成员的类上无效指针/双精度释放
- C++:释放动态数组(结构成员)和指向此结构的指针的方法
- 如何保证当模板类成员是指针时正确释放模板类成员
- 释放在不同同步上下文中使用的类成员
- 当类对象完成时,是否为 C++ 类的数据成员动态分配的内存会释放
- 释放 C++ 中指针成员的动态内存
- 释放不是 GDI+ 图像类的成员
- 正在释放std::list成员
- 为类的成员变量释放动态分配的内存会产生错误
- 何时使用alloca为类成员释放内存
- 在显式销毁对象之后但在其内存被释放之前调用成员函数是否合法?
- 释放成员指针