C++ .NETC++;使用旧语法的内存泄漏?
我正在处理应用程序中的内存泄漏问题。我将其缩小到旧语法来声明“Single”类型。创建了一个带有声明的测试应用程序,它在耗尽大量内存后崩溃。我错过了什么 测试代码如下:C++ .NETC++;使用旧语法的内存泄漏?,c++,.net,syntax,memory-leaks,managed-c++,C++,.net,Syntax,Memory Leaks,Managed C++,我正在处理应用程序中的内存泄漏问题。我将其缩小到旧语法来声明“Single”类型。创建了一个带有声明的测试应用程序,它在耗尽大量内存后崩溃。我错过了什么 测试代码如下: #include "stdafx.h" using namespace System; int main() { while(1) { System::Single * sngTemp = new System::Single(0.0); //System::String
#include "stdafx.h"
using namespace System;
int main()
{
while(1)
{
System::Single * sngTemp = new System::Single(0.0);
//System::String ^sngTemp = gcnew System::String(S"dsfasdfasdf");
}
return 0;
}
这不是“旧语法”与“新语法”的问题——C++/CLI也会有同样的行为System::Single
是float
的别名,可以在堆栈、非托管堆或托管堆上分配
在这里,因为您使用的是未修饰的new
,所以您在非托管堆上分配了一个,即执行与以下操作完全相同的操作:
float* sngTemp = new float(0.0);
为什么人们不认为这会泄露呢?如果要进行垃圾回收,请使用托管分配(
\uu gc new
旧语法);或者更好的是,根本不要在堆上分配值类型,这样就不会有问题。这不是“旧语法”与“新语法”的问题——C++/CLI也会有同样的行为System::Single
是float
的别名,可以在堆栈、非托管堆或托管堆上分配
在这里,因为您使用的是未修饰的new
,所以您在非托管堆上分配了一个,即执行与以下操作完全相同的操作:
float* sngTemp = new float(0.0);
为什么人们不认为这会泄露呢?如果要进行垃圾回收,请使用托管分配(
\uu gc new
旧语法);或者更好的是,根本不要在堆上分配值类型,这样就不成问题了。你的问题是什么?您肯定不是在问为什么代码会崩溃。你是在分配内存,而不是释放内存。问题是“为什么我只在使用gcnew时得到垃圾收集,而在使用new时没有?”delnan,我故意不释放内存。我期待GC做!!我错了吗?凯特,你的问题很接近我要问的问题。@MaheswaranRamados“gcnew”这个名字就是一个线索。这是C++,我们决定我们想要什么,不想要什么。你想要垃圾收集?使用gcnew。你想自己做吗?不要使用gcnew。你的问题是什么?您肯定不是在问为什么代码会崩溃。你是在分配内存,而不是释放内存。问题是“为什么我只在使用gcnew时得到垃圾收集,而在使用new时没有?”delnan,我故意不释放内存。我期待GC做!!我错了吗?凯特,你的问题很接近我要问的问题。@MaheswaranRamados“gcnew”这个名字就是一个线索。这是C++,我们决定我们想要什么,不想要什么。你想要垃圾收集?使用gcnew。你想自己做吗?不要使用gcnew。谢谢。我想这就清楚了。我希望System::Single与System::String等其他系统一样工作。我看到的区别是,Single被记录为一个结构,String被记录为一个类,这可能是一个需要的线索,如果它是GCed与否。再次感谢,谢谢。我想这就清楚了。我希望System::Single与System::String等其他系统一样工作。我看到的区别是,Single被记录为一个结构,String被记录为一个类,这可能是一个需要的线索,如果它是GCed与否。再次感谢你。