【问题标题】:.NET C++ memory leaks using old syntax?.NET C++ 内存泄漏使用旧语法?
【发布时间】:2012-01-25 13:36:32
【问题描述】:

我正在处理我的应用程序中的内存泄漏问题。我将其缩小到旧语法以声明“Single”类型。使用声明创建了一个测试应用程序,它在消耗大量内存后崩溃。我错过了什么?

测试代码在这里:

#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;
}

【问题讨论】:

  • 你有什么问题?当然,您不会问为什么该代码会崩溃。您正在分配内存而不是释放它。
  • 问题是“为什么我只在使用 gcnew 时才进行垃圾回收,而不是在使用 new 时?”
  • delnan,我故意不释放。我期待GC做!我错了吗?
  • 凯特,你的问题很接近我正在寻找的答案。
  • @MaheswaranRamados “gcnew”这个名字是一个线索。这是 C++,我们决定我们想要什么和不想要什么。你想要垃圾收集吗?使用 gcnew。你想自己做吗?不要使用 gcnew。

标签: c++ .net syntax memory-leaks managed-c++


【解决方案1】:

这不是“旧语法”与“新语法”的问题——C++/CLI 会有相同的行为。 System::Singlefloat的别名,可以分配在栈上、非托管堆上、托管堆上。

在这里,因为您使用的是未修饰的new,所以您在非托管堆上分配了一个,即执行完全相同的操作:

float* sngTemp = new float(0.0);

为什么希望这会泄露?如果您想要垃圾收集,请使用托管分配
__gc new 旧语法);或者更好的是,根本不要在堆上分配值类型,这不是问题。

【讨论】:

  • 谢谢。我认为这可以清除它。我期待 System::Single 的工作方式与 System::String 等其他系统相同。我看到的不同之处在于 Single 被记录为 Structure 而 String 被记录为 Class ,这可能是人们需要的线索,如果它是 GCed 与否。再次感谢您。
猜你喜欢
  • 2022-12-06
  • 2011-03-22
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 2010-11-13
相关资源
最近更新 更多