type
TTest = class
a: integer;
end;
TTest2 = class(TTest)
b: integer;
end;
var c:TTest;
begin
c:=TTest2.Create();
c.Free;
end;
回答
不,它不会。
基类类型的变量可用于从其子类实例化对象(它们是类型兼容的),但请注意,使用这样的变量只能访问TTest成员,而不能访问TTest2成员。这意味着;您可以访问“a”,但不能访问“b”。另外,如果在TTest2.Creation执行过程中遇到任何异常,Create将不会返回部分构建的对象。但是,如果在TTest2.Create和c.Free调用之间有其他代码,则在这些代码中引发异常可能导致内存泄漏;因为C.Free可能不会执行。在这种情况下,你应该使用try-finally块。
不,这里没有内存泄漏。如果成功,构造函数只返回一个新资源。您只能在构造函数成功和时发生泄漏,并且不能致电Free
。由于您在构造函数和Free
的调用之间什么都不做,所以不会出现泄漏。
如果构造失败,那么:
- 调用析构函数释放任何资源。
- 引发异常。
- 构造函数不会返回,因为异常会更改程序流。
- 您的示例中的对象变量
c
的赋值不会发生。
请注意,您接受的@vcldeveloper的答案在说明返回nil
时不正确。没有任何东西从引发的构造函数中返回。
你应该总是包装使用try /终于如下创建/免费对:
obj := TMyClass.Create;
try
obj.DoSomething;
finally
obj.Free;
end;
你只需要保护资源一旦被分配。所以你在作业后放置try
。
如果这是一个错误的构造函数之前放置try
:
try
obj := TMyClass.Create;
obj.DoSomething;
finally
obj.Free;
end;
如果构造失败,那么obj
不分配,然后当Free
运行(它将运行感谢终于来了!)它在未初始化的变量上调用,导致未定义的行为。
说“构造函数失败”意味着“对象构造中的代码导致了异常”是否正确? – mjn 2011-02-26 12:08:20
是的,这是正确的。构造函数要么成功要么提出。 – 2011-02-26 12:15:36
- 1. 这是否会导致内存泄漏?
- 2. 这是否会导致内存泄漏?
- 3. fdopen()是否会导致内存泄漏?
- 4. Application.terminate是否会导致内存泄漏?
- 5. 这是否会导致内存泄漏(在.NET中)?
- 6. 这个objective-c代码是否会导致内存泄漏?
- 7. 这些实现是否会导致内存泄漏?
- 8. 这是否会导致PHP内存泄漏?
- 9. 这种编码风格是否会导致内存泄漏
- 10. 这是导致内存泄漏的iPhone
- 11. 是否addEventListener导致内存泄漏?
- 12. 是否会由于内存泄漏而导致内存不足?
- 13. 这是否会造成内存泄漏?
- 14. 由于CUcontext缓存,Matlab是否会导致Cuda泄漏内存?
- 15. 存储过程是否会导致内存泄漏?
- 16. 这可能导致JavaScript内存泄漏?
- 17. Java中潜在的内存泄漏,这段代码是否会导致内存泄漏?
- 18. 这段代码是否导致内存泄漏?
- 19. 这段JavaScript代码是否导致内存泄漏?
- 20. jQuery.data会导致内存泄漏吗?
- 21. 委托会导致内存泄漏吗?
- 22. 内存泄漏会导致getaddrinfo EMFILE
- 23. 删除iframe会导致内存泄漏?
- 24. DynamicResource会导致内存泄漏吗?
- 25. Can Observable.Timer()会导致内存泄漏吗?
- 26. QProcess :: startDetached()会导致内存泄漏吗?
- 27. ConditionalWeakTable的值是否会导致内存泄漏?
- 28. 以下结构是否会导致内存泄漏
- 29. 该代码块是否会导致内存泄漏?
- 30. 内存泄漏是否会导致UITableView滚动出现问题?
构造函数在失败时不返回零。在你的评估中,你认为这个特殊的代码块不会泄漏,但它不是一个非常有用的构造。 – 2011-02-26 21:00:16
谢谢艾伦,删除那部分不会误导未来的读者。 – vcldeveloper 2011-02-26 22:38:00