GVKun编程网logo

如果我不对笔对象调用Dispose,会发生什么?

24

在这篇文章中,我们将为您详细介绍如果我不对笔对象调用Dispose,会发生什么?的内容。此外,我们还会涉及一些关于c#–为什么调用Dispose()?内存泄漏不会发生?、ios–如果我不小心覆盖了Ap

在这篇文章中,我们将为您详细介绍如果我不对笔对象调用Dispose,会发生什么?的内容。此外,我们还会涉及一些关于c# – 为什么调用Dispose()?内存泄漏不会发生?、ios – 如果我不小心覆盖了Apple的私有API,会发生什么?、ios – 如果我们不在init方法中检查“if(self)”会发生什么?、node.js – 如果我在Kriskowal的q中拒绝/解析多次,会发生什么?的知识,以帮助您更全面地了解这个主题。

本文目录一览:

如果我不对笔对象调用Dispose,会发生什么?

如果我不对笔对象调用Dispose,会发生什么?

如果我不调用此代码片段中Disposepen对象,会发生什么?

private void panel_Paint(object sender, PaintEventArgs e){    var pen = Pen(Color.White, 1);    //Do some drawing}

答案1

小编典典

Pen会由GC在未来某个不确定的点进行收集,你是否不叫Dispose

但是,GC不会清除笔所拥有的任何非托管资源(例如GDI
+句柄)。GC仅清除托管资源。通过调用Pen.Dispose,您可以确保及时清理这些非托管资源,并且不会泄漏资源。

现在,如果Pen拥有终结器,并且该终结器清除了非托管资源,那么当Pen垃圾被回收时,那些非托管资源将被清理。但是重点是:

  1. 您应该Dispose显式调用以便释放非托管资源,并且
  2. 您不必担心是否有终结器可以清除非托管资源的实现细节。

Pen实施IDisposableIDisposable用于处置非托管资源。这是.NET中的模式。

有关该主题的先前评论,请参见此答案。

c# – 为什么调用Dispose()?内存泄漏不会发生?

c# – 为什么调用Dispose()?内存泄漏不会发生?

编辑:我的问题没有得到我正在寻找的主要答案.我不清楚我真的很想知道两件事情:

>不能调用dispose()会导致内存泄漏?
>如果您有一个大型程序,并且永远不会在任何Idisposable对象上调用dispose(),那么最糟糕的事情是什么?

我的印象是,如果dispose()不在Idisposable对象上调用,则可能会发生内存泄漏.

根据这个thread的讨论,我的看法是不正确的;如果dispose()不被调用,则不会发生内存泄漏.

为什么打扰dispose()呢?它只是为了立即释放资源,而不是稍后释放资源?如果您有一个大型程序,并且不会在任何Idisposable对象上调用dispose(),那么最糟糕的事情是什么?

解决方法

dispose用于释放非管理资源.这可能意味着内存,如果一个类分配了非托管内存,但它通常是本机对象和资源,如打开的文件和数据库连接.

您经常需要在本身没有任何非管理资源的类上调用dispose,但它包含另一个类,该类是一次性的,可能具有非管理资源.

开发人员有时也有必要实施处置,以确保确定性的最终确定 – 保证资源被释放的顺序.

还要注意,如果dispose不被调用,实现dispose的类通常也有一个finalizer来释放resourcdes.具有终结器的对象与没有一个的类不同的生命周期.当它们准备好GC时,GC将看到它们具有一个终结器,而不是在GC准备就绪时立即收集对象,它将其放入最终化队列中.这意味着该对象会生成一个额外的GC迭代.当您调用处理时,通常(但不是必需)执行调用GC.SuppressFinalize(),这意味着终结器不再需要调用.

如果一个类实现了Idisposable,你应该总是调用dispose().

ios – 如果我不小心覆盖了Apple的私有API,会发生什么?

ios – 如果我不小心覆盖了Apple的私有API,会发生什么?

假设Apple在私有头文件中定义了API:

// Can't see this at all
@interface NSThing
- (void)secretMethod;
@end

我有一个类别:

@interface NSThing (Helpers)
- (void)secretMethod;
@end

这会覆盖Apple的实现吗?他们的其他私有方法是否会开始调用我的实现?

解决方法

从 “Avoid Category Method Name Clashes”开始:

If the name of a method declared in a category is the same as a method
in the original class,or a method in another category on the same
class (or even a superclass),the behavior is undefined as to which
method implementation is used at runtime. This is less likely to be an
issue if you’re using categories with your own classes,but can cause
problems when using categories to add methods to standard Cocoa or
Cocoa Touch classes.

因此,如果您“意外”实现了与其名称相同的类别方法
现有方法(私有或非私有),行为未定义.

因此,您应该在类别方法前面加上前缀姓名冲突不太可能.

ios – 如果我们不在init方法中检查“if(self)”会发生什么?

ios – 如果我们不在init方法中检查“if(self)”会发生什么?

参见英文答案 > In Objective-C why should I check if self = [super init] is not nil?                                    9个
我开始研究我们的高级代码完成的代码,我发现init方法总是有代码 – (id)init方法.他们通过以下方式使用代码.以下代码用于所有viewControllers.

self = [super initWithNibName:@"ViewController" bundle:[NSBundle mainBundle]];
    return self;

if(self)和self在这部分有什么用?

//And in some viewcontroller contains.
    self = [super initWithNibName:@"ViewController" bundle:[NSBundle mainBundle]];
    if (self) {
        //Do some stuff
    }
    return self;

解决方法

当您在方法中访问实例变量时,代码等同于通过自指针寻址它们:

- (void)method {
  iVar = 1;
  // actually the following line will be executed:
  self->iVar = 1;
}

因此,如果由于某种原因自身指针为零并且您在init方法中访问您的ivars,您的应用程序将崩溃,因为您将尝试derefenrence null指针.例如以下简单示例将崩溃:

@implementation TestObj {
  int a;
}

- (id) init {
  self = [super init];
  self = nil;

  a = 1; // Crash
  return self;
}
@end

此外,如果您的[super init]方法因任何原因返回nil,那可能表示出现了问题,您不应继续进行对象初始化以及任何其他必需的工作.

node.js – 如果我在Kriskowal的q中拒绝/解析多次,会发生什么?

node.js – 如果我在Kriskowal的q中拒绝/解析多次,会发生什么?

我正在研究承诺模式,并使用kriskowal的q为node.js,

拥有此代码段:

var deferred = Q.defer();
try {
    messageData = JSON.parse(message);
} catch (e) {
    global.logger.warn('Error parsing JSON message.');
    deferred.reject(e);
}
...
if (some_reason)
    deferred.resolve(something);
...
return deferred.promise;

如果解析器失败并且some_reason都为真,该怎么办?

执行程序从拒绝通过解决和承诺的方法在不同的时间被调用,从而产生一个错误?

我应该避免多次呼叫拒绝/解决?

解决方法

自 promises can only resolve once(要么完成或拒绝)以来,第一个决议胜出,任何进一步的电话都将被忽略。从 the docs:

In all cases where a promise is resolved (i.e. either fulfilled or rejected),the resolution is permanent and cannot be reset. Attempting to call resolve,reject,or notify if promise is already resolved will be a no-op.

Should i avoid to call reject/resolve multiple times?

您甚至可以设计您的应用程序,让两种方法相互对抗,以解决延迟问题,但一般来说应避免减少读者的混淆。

关于如果我不对笔对象调用Dispose,会发生什么?的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于c# – 为什么调用Dispose()?内存泄漏不会发生?、ios – 如果我不小心覆盖了Apple的私有API,会发生什么?、ios – 如果我们不在init方法中检查“if(self)”会发生什么?、node.js – 如果我在Kriskowal的q中拒绝/解析多次,会发生什么?的相关知识,请在本站寻找。

本文标签: