【问题标题】:C++ pointers simple questionC++指针简单问题
【发布时间】:2010-04-30 14:58:39
【问题描述】:

如果我在循环中有以下几行:

Type *unite = new Type(newSize); 

double *array= new double[anySize];

如果我的内存中没有删除操作符,那么与内存有关的行为是什么?它会不断地在不同的内存位置分配对象和数组,从而导致内存泄漏?

【问题讨论】:

    标签: c++ memory pointers memory-leaks


    【解决方案1】:

    是的,它会的。这个:

    for (int i = 0; i < 10; ++i) 
    {
      Type* unite = new Type(newSize);
    }
    

    将分配 10 个 Type 类型的对象,它们都位于不同的位置。它们都不会被释放,最后你将没有指向它们中的任何一个的指针。您将泄漏10 * sizeof(Type) 字节的内存。

    同样,这个

    for (int i = 0; i < 10; ++i) 
    {
      double *array= new double[anySize];
    }
    

    出于同样的原因会泄漏10 * anySize * sizeof(double)字节的内存。

    【讨论】:

    • 只是一个小细节,但数组分配不应该有一些恒定的空间开销,比如10 * anySize * sizeof(double) + c
    • 实现不需要过度分配来存储数组的大小信息。例如,数组大小的数据有可能存储在某个表中,无论分配是否发生,该表都存在。因此,虽然您是对的,也会泄漏一些开销,但无法量化多少(甚至像+ c 这样一般的说法,因为这意味着开销随着分配而增长O(n),这是'不一定正确)以适用于所有实现的方式。
    【解决方案2】:

    它会不断地在不同的内存位置分配对象和数组,从而导致内存泄漏?

    假设你的意思是:

     for (;x;x)
     {
        double *ptr = new double[42];
     }
    

    那么答案是肯定的,内存泄露了。

    【讨论】:

      【解决方案3】:

      是的。您将在循环的每次迭代中泄漏内存。 boost::scoped_ptrboost::scoped_array 就是为了处理这种情况而设计的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 2010-11-15
        • 2011-08-02
        • 2011-04-15
        • 1970-01-01
        相关资源
        最近更新 更多