Memory management 托管c+的垃圾收集器+; 通常C++中有一个指针,如果要创建一个动态对象作为参数传递到函数中,它将被做为类似的< /P> Object *myObj = new Object; someFunction(myObj); delete myObj; myObj = nullptr;

Memory management 托管c+的垃圾收集器+; 通常C++中有一个指针,如果要创建一个动态对象作为参数传递到函数中,它将被做为类似的< /P> Object *myObj = new Object; someFunction(myObj); delete myObj; myObj = nullptr;,memory-management,garbage-collection,c++-cli,managed-c++,Memory Management,Garbage Collection,C++ Cli,Managed C++,相对于 someFunction(new Object); 为了不泄漏内存。现在假设我正在创建一个垃圾收集对象;相同的规则是否仍然适用,或者垃圾收集器是否能够从函数调用中创建的内存中删除动态创建的对象,如下所示 someFunction(gcnew Object); 当您的应用程序中不再有对托管对象的引用时,它将被垃圾收集器销毁 在您的情况下,如果您的函数没有将对象分配到其他地方,那么一旦您的函数返回,它将被缓冲以进行垃圾收集。当您的应用程序中没有对托管对象的引用时,托管对象将被垃圾回收器全

相对于

someFunction(new Object);
为了不泄漏内存。现在假设我正在创建一个垃圾收集对象;相同的规则是否仍然适用,或者垃圾收集器是否能够从函数调用中创建的内存中删除动态创建的对象,如下所示

someFunction(gcnew Object);

当您的应用程序中不再有对托管对象的引用时,它将被垃圾收集器销毁


在您的情况下,如果您的函数没有将对象分配到其他地方,那么一旦您的函数返回,它将被缓冲以进行垃圾收集。

当您的应用程序中没有对托管对象的引用时,托管对象将被垃圾回收器全部销毁


在您的情况下,如果您的函数没有将对象分配到其他地方,那么一旦您的函数返回,它将被缓冲以进行垃圾收集。

是的,因为一旦分配给该内存的变量超出范围,正在运行的垃圾收集器将删除动态分配的内存。例如,在Java中,您可以说:

button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e)
    {
        // do something.
    }
});

“ActionListener()”一旦超出范围就会被删除。我只是在这里提到java,因为它的垃圾收集特性,并且意识到这是C++问题。我只是用它来解释一个概念

是的,因为一旦分配给动态分配内存的变量超出范围,正常工作的垃圾收集器就会删除该内存。例如,在Java中,您可以说:

button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e)
    {
        // do something.
    }
});
    someFunction(gcnew Object);
“ActionListener()”一旦超出范围就会被删除。我只是在这里提到java,因为它的垃圾收集特性,并且意识到这是C++问题。我只是用它来解释一个概念

    someFunction(gcnew Object);
当然可以。该对象不会存活很长时间,如果某个函数不以其他方式存储引用,则下一个gen#0集合可能会将其销毁。您可以声明一个变量,但这是毫无意义的,它将在运行时被抖动优化器删除,最终得到完全相同的代码


但是要记住,
delete
操作符仍然存在于C++/CLI中,这一点非常重要。但是在C++中做的事情和它完全不同。它调用类的IDisposable::Dispose()实现方法。这提供了“确定性破坏”,就像它在C++中一样。这个词不太恰当,它确实是确定性的清理。该接口由存储“昂贵”操作系统资源的任何托管类实现,在垃圾回收器清理之前,您不希望保留这种资源

样板示例是System::Drawing::Bitmap类。一个非常小的类,它是一大块地址空间和(可能)一个被锁定的文件的包装器。当你不再需要它时,你要确保把它处理掉。您可以编写这样的代码:

void dosomething() {
    Bitmap^ bmp = gcnew Bitmap("foo.png");
    drawBitmap(bmp);
    delete bmp;
}
但这不是正确的代码,它不是异常安全的。drawBitmap引发异常时,将绕过delete运算符调用。顺便说一句,这不是世界末日,实际上不会导致泄漏,因为GC最终会清理它。但是,C++的CLI设计者对C++ C++中的“堆栈语义”进行了仿真,称为“栈语义”:

void dosomething() {
    Bitmap bmp("foo.png");    // NOTE: no ^ hat
    drawBitmap(bmp);
}   // <=== bmp is disposed here
void dosomething(){
位图bmp(“foo.png”);//注意:无^hat
绘图位图(bmp);
}   // 
当然可以。该对象不会存活很长时间,如果某个函数不以其他方式存储引用,则下一个gen#0集合可能会将其销毁。您可以声明一个变量,但这是毫无意义的,它将在运行时被抖动优化器删除,最终得到完全相同的代码


但是要记住,
delete
操作符仍然存在于C++/CLI中,这一点非常重要。但是在C++中做的事情和它完全不同。它调用类的IDisposable::Dispose()实现方法。这提供了“确定性破坏”,就像它在C++中一样。这个词不太恰当,它确实是确定性的清理。该接口由存储“昂贵”操作系统资源的任何托管类实现,在垃圾回收器清理之前,您不希望保留这种资源

样板示例是System::Drawing::Bitmap类。一个非常小的类,它是一大块地址空间和(可能)一个被锁定的文件的包装器。当你不再需要它时,你要确保把它处理掉。您可以编写这样的代码:

void dosomething() {
    Bitmap^ bmp = gcnew Bitmap("foo.png");
    drawBitmap(bmp);
    delete bmp;
}
但这不是正确的代码,它不是异常安全的。drawBitmap引发异常时,将绕过delete运算符调用。顺便说一句,这不是世界末日,实际上不会导致泄漏,因为GC最终会清理它。但是,C++的CLI设计者对C++ C++中的“堆栈语义”进行了仿真,称为“栈语义”:

void dosomething() {
    Bitmap bmp("foo.png");    // NOTE: no ^ hat
    drawBitmap(bmp);
}   // <=== bmp is disposed here
void dosomething(){
位图bmp(“foo.png”);//注意:无^hat
绘图位图(bmp);

} //如果分配在()与否之间并不重要。您不再需要用管理C++来创建QLL对象。即使你的对象在()中被创建,你的C++/CLI对象也会被垃圾回收器收集和销毁。如果分配在()与否之间就不重要了。你不再需要用管理C++来创建QLL。垃圾收集器将按预期收集和销毁您的C++/CLI对象,即使您的对象是在()中创建的。