我想知道是否有人可以帮我解决一些与独特指针混淆的问题。请考虑以下代码:
// 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.
我错过了什么?如果有人能填写我在这里发生的事情并确认或不赞成我的推测,我将非常感激
答案 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
}