唯一指针内存泄漏

时间:2016-08-04 00:08:28

标签: c++ c++11 visual-c++ new-operator unique-ptr

我想知道是否有人可以帮我解决一些与独特指针混淆的问题。请考虑以下代码:

// some class "complex" defined here

int main()
{
    while(1) 
    {
        unique_ptr<complex> p(new complex[256]);
        p.reset();
    }
    return 1;
}

根据我的理解,当我在唯一指针上调用reset()时,它应该删除其原始指针所引用的对象。在这种情况下,对象恰好是创建的256个类型complex中的第一个对象。因为那是new complex[256]所做的,我是对的吗?它只是返回一个指向数组中第一个对象的指针(它当然也会创建)?所以256个对象的其余部分应保持不变。

遵循该逻辑,无限循环应该创建内存泄漏,但这不会发生。我正在使用MS Visual Studio 2013.

我错过了什么?如果有人能填写我在这里发生的事情并确认或不赞成我的推测,我将非常感激

1 个答案:

答案 0 :(得分:10)

unique_ptr超出范围时,delete将在其拥有的指针上调用new[]。因此,您使用delete而不是delete[]删除delete分配的内存。这是未定义的行为,尝试进一步推断为什么你的代码没有按照你期望的方式行事,这是毫无意义的。

但可能发生的事情是在该指针上调用complex意味着只有数组中的第一个new对象被销毁(意味着它的析构函数被调用)。不会为剩余的255个对象调用析构函数,但仍会释放整个数组占用的内存。

我认为你的期望是你的程序使用越来越多的内存,最后在unique_ptr分配失败时死掉,但如果数组占用的内存被释放,那就永远不会发生。 / p>

使用unique_ptr<complex[]> p(new complex[256]); // ^^ 处理数组的正确方法是对数组类型使用部分特化

std::make_unique

或者,如果您的标准库实现auto p = std::make_unique<complex[]>(256); (C ++ 14),那么使用

public func padLockScreenViewController(padLockScreenViewController: ABPadLockScreenViewController!, validatePin pin: String!) -> Bool {

    var success = false
    let defaults = NSUserDefaults.standardUserDefaults()
    let baseUrl = defaults.stringForKey(Util.serverUrlKey)
    let semaphore: dispatch_semaphore_t = dispatch_semaphore_create(0)

    let params = ["Pin": pin]

    Alamofire.request(.POST, "\(baseUrl!)/sw/airpharm/login", parameters: params).responseObject {
        (response: Response<LoginResult, NSError>) in

        if let loginResult = response.result.value where loginResult.code == HTTPStatusCode.OK {
            AirpharmService.id = loginResult.result!.id
            success = true
        }

        dispatch_semaphore_signal(semaphore)
    }

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
    return success
}