c++ - 如何在栈和堆对象之间转换

标签 c++ heap-memory stack-memory

例子:

Class *_obj1;
Class *_obj2;

void doThis(Class *obj) {}

void create() {
    Class *obj1 = new Class();
    Class obj2;

    doThis(obj1);
    doThis(&obj2);

    _obj1 = obj1;
    _obj2 = &obj2;
}

int main (int argc, const char * argv[]) {

    create();

    _obj1->doSomething();
    _obj2->doSomething();

    return 0;
}

这会创建 2 个对象,创建指向它们的指针,然后 main() 对每个对象调用一个方法。 Class 对象创建一个 char* 并存储 C 字符串“Hello!”在里面; ~Class() 释放器释放内存。 doSomething() 方法使用 printf() 打印出“buff: %s”。很简单。现在,如果我们运行它,我们会得到:

Dealloc
Buff: Hello!
Buff: ¯ø_ˇ

显然堆栈对象在这里不起作用 - 很明显,当函数退出时,指针 _obj2 指向堆栈中的某个位置。这就是我在之前的问题中使用堆对象的原因,人们告诉我这是“愚蠢的”。

因此,第一个问题是:如果如何将堆栈对象 (obj2) 转换为堆对象,以便它在 create() 退出后不被释放?我想要一个直接的答案,而不是一个正如许多人所做的那样,傲慢地“你做错了”。因为在这种情况下,堆栈对象无法工作,所以堆对象似乎是唯一的方法。编辑:此外,转换回堆栈对象也很有用。

第二个问题:堆对象“错误”的具体例子是创建一个新的vector<string>*使用 new运算符(operator)。 如果动态分配 STL 对象是错误的,那么正确的方法是什么?显然,如果您将它们创建为堆栈对象,它会失败,因为它们会立即被释放,但我被告知(再次,一个非常高级成员)动态分配它们会破坏堆。那么正确的做法是什么?

最佳答案

So, the first question is: if how can I convert the stack object (obj2) to a heap object so it's not deallocated after create() exits? I want a straight answer,

直接的答案是:您不能在堆栈和堆之间“转换”对象。正如其他人指出的那样,您可以创建位于另一个空间中的对象的拷贝,仅此而已。

The second question: the specific example of heap objects being "wrong" was creating a new vector* using the new operator. If dynamically allocating STL objects is wrong, then what's the right way? Obviously if you create them as stack objects it fails because they're immediately deallocated, but I've been told (again, by a very high-ranking member) that dynamically allocating them can corrupt the heap.

动态分配 STL 对象本身不会破坏堆。 (不知道你可能在哪里听说过。)

如果您想在创建它的函数之外使用堆栈分配的 STL 对象,您不能,因为对象所在的堆栈空间仅在创建它的函数。

但是,您可以返回对象的拷贝:

std::vector<char> SomeFunc()
{
    std::vector<char> myvector;
    // myvector.operations ...
    return myvector;
}

不过,正如我所说,这将返回对象的拷贝,而不是原始对象本身——这是不可能的,因为包含该对象的堆栈在函数返回后展开。

另一种选择是让调用者传递一个引用/指针到您的函数操作的对象,如果这对您的特定场景有意义的话:

void SomeFunc(std::vector<char>& destination)
{
    // destination.operations ...
}

void AnotherFunc()
{
    std::vector<char> myvector;
    SomeFunc(myvector);
}

如您所见,您仍然在堆栈上分配了所有内容,并且避免了依赖复制构造函数返回对象拷贝的(有时是必然的)开销。

关于c++ - 如何在栈和堆对象之间转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5058831/

相关文章:

Haskell 批处理文件处理不会改善空间配置文件

java - Java 程序如何跟踪其运行期间使用的最大实际堆大小?

c++ - 堆栈或堆上的对象分配

c - 从堆栈分配 - C 中的数据对齐问题

operating-system - 多个堆栈和堆放在虚拟内存中的什么位置?

c++ - 模板类转换错误

c++ - 等待时间过去而不用在C窗口中忙着等待

c++ - DEFPUSHBUTTON 不将焦点默认为 IDCANCEL

c++ - 私有(private)构造函数和 make_shared

c++ - 在堆 : small pieces or big piece 上分配的最佳方法是什么