// тот же класс А что был выше
A a; // будет создан автообъект с реальным выделением памяти и инициализацией. 'a' является указателем со статусом POINTER_AUTOMATIC
A* pA; // память под объект не выделена, объекта нет. pA является указателем со статусом POINTER_INVALID или POINTER_DYNAMIC?
事实上,该对象的寿命必须与指向它的 "活 "指针的寿命相匹配。当然,POINTER_DYNAMIC动态对象也是一个半途而废的解决方案,它为考虑不周的编码带来了麻烦。但POINTER_AUTOMATIC 也没有给我提供我需要的可扩展性,以正确处理对象。我们需要这样做--如果从块中退出时没有创建指向对象的指针,除了创建对象的自变量,那么就删除对象。如果引用是在当前块之外收到的--当这些引用仍然存在时不要删除对象。这样就有了可扩展性,而且程序员也不必一直看着删除。(例如,如果你现在写A* a = new A;然后再写a = new A,那么第一个对象将永远丢失,而且保证在退出程序时,日志中会出现内存泄露错误)。而著名的代码优化器是在哪里看的呢?)
Ilya Malev: 从本质上讲,一个对象的寿命必须与它的 "活 "指针的寿命相对应。当然,mcl POINTER_DYNAMIC类型的动态对象也是一种半选择的解决方案,在编码效率不高的情况下会造成麻烦。但POINTER_AUTOMATIC 也没有给我提供我需要的可扩展性,以正确处理对象。我们需要这样做--如果从块中退出时没有创建指向对象的指针,除了创建对象的自变量,那么就删除对象。如果引用是在当前块之外收到的--当这些引用仍然存在时不要删除对象。这样就有了可扩展性,而且程序员也不必一直看着删除。(例如,如果你现在写A* a = new A;然后再写a = new A,那么第一个对象将永远丢失,而且保证在退出程序时,日志中 会出现内存泄露错误)。而著名的代码优化器是在哪里看的呢?)
只是在MCL中和C++中不一样。在这里,指针根本不是一个独立的数据类型,所以两者都是对象,而一个变量包含它的句柄。
对吗?
但我不能确定指针在创建后得到什么状态:POINTER_INVALID还是POINTER_DYNAMIC。理论上,它应该是POINTER_INVALID,直到它从新 得到地址。
就是说,宣布
而你将拥有完全相同的 "自动对象",但你必须自己删除它。
这不是自动...
我不能说指针在创建后得到哪种状态,POINTER_INVALID还是POINTER_DYNAMIC。在概念上,它应该是POINTER_INVALID,直到new 得到地址。
这是正确的,状态将是POINTER_INVALID。但变量a和pA是同一类型的。只有a是一个常数,在创建时调用构造器,在离开区块时调用析构器,而pA是随机访问的,构造器和析构器被任意调用。
一个没有*的变量声明,如果没有特殊的技巧,就不能得到POINTER_INVALID状态,这也是事实,但不是因为变量的类型不同,而是因为编译器很好地控制了构造器和析构器的调用,禁止它再赋值。
而且,由于变量的类型基本相同,通过它们访问类方法的逻辑也不尽相同
这是正确的,状态将是POINTER_INVALID。但变量a和pA是同一类型的。只有a是常数,并且在创建时调用构造器,在退出区块时调用析构器,而pA是随机访问的,并且是随机调用构造器和析构器。
所以所有的麻烦只是来自于你需要区分 它们的事实。也就是说,一个指针需要一个更负责任的态度(动态 的态度)。
问题的唯一原因是,必须 对它们进行区分。也就是说,一个指针需要一个更负责任的态度(动态 的态度)。
在我看来,OOP的意义只在于对象引用可以被传递和存储,并且可以在其中编写不同行为的类。开始存储对 "自动对象 "的引用,甚至没有触及多态性,你已经失去了它们的所有区别(因为没有A&类型的用户变量)。
如果没有特殊的技巧,一个没有*的变量声明不能被赋予POINTER_INVALID状态,这也是事实,但不是因为变量的类型不同,而是因为编译器很好地控制了构造器和析构器的调用,禁止给它分配不同的值。
正是如此。自动对象指针不会改变其状态,而POINTER_DYNAMIC 指针在程序执行的任何时刻都可能变得无效。原因并不那么重要,重要的是这种事件本身的可能性。
正是如此。自动对象指针不会改变其状态,而POINTER_DYNAMIC 指针可能在程序运行时变得无效。原因并不那么重要,重要的是这种事件本身的可能性。
有一种极好的安全治疗方法可以解决这个问题。
好吧,我认为程序员应该注意对象的寿命和访问变量的方式,如果架构从一开始就考虑得很周全,那么在写完代码的一两年后,错误就会降到最低。从本质上讲,一个对象的寿命必须与它的 "活 "指针的寿命相对应。当然,mcl POINTER_DYNAMIC类型的动态对象也是一种半选择的解决方案,在编码效率不高的情况下会造成麻烦。但POINTER_AUTOMATIC 也没有给我提供我需要的可扩展性,以正确处理对象。我们需要这样做--如果从块中退出时没有创建指向对象的指针,除了创建对象的自变量,那么就删除对象。如果引用是在当前块之外收到的--当这些引用仍然存在时不要删除对象。这样就有了可扩展性,而且程序员也不必一直看着删除。(例如,如果你现在写A* a = new A;然后再写a = new A,那么第一个对象将永远丢失,而且保证在退出程序时,日志中 会出现内存泄露错误)。而著名的代码优化器是在哪里看的呢?)
这也是一个相当大的惊喜。毕竟,它清楚地知道每一个逃逸的字节,但并不想释放它。所以它目前根本就不看恐龙点的?它只是简单地计算申请的内存和最后释放的内存之间的差异。
而寿命和空/丢失的指针只是其中一个问题。在我们讨论与指针到对象的隐式转换有关的问题之前,这就是它的崩溃之处)当错误地(例如,编译器一定不允许编译这样的代码),而不是预期的指针,你可能得到一个由指针组成的对象的副本,这反过来可能指向任何地方。)好吧,你自己已经写过关于比较操作的文章。那里的一切也都是非常隐蔽的。
1.这也是一个相当大的惊喜。毕竟,它清楚地知道每一个逃逸的字节,不想释放它。所以它目前根本就不看恐龙点?它只是计算请求的内存和最后释放的内存之间的差异。
而寿命和空/丢失的指针只是其中一个问题。
1.其实不然,给动态对象写一个简单的GC,对开发者来说是小菜一碟,但他们故意留下这些信息,让编码者看到他们的程序中出现了故障。因为他们的动态对象是这样一个半C#(我不是这方面的专家,但据我所知)--好像对象的行为是一样的(没有指针,但所有东西都是对象),而且没有为它们开发精心的子系统。
2.嗯,是的,当然,如果对象变量是同一类型的(也就是说:不是自动或独立地删除,而是在没有对它们的引用时由内置的垃圾收集器删除),那么对它们的所有引用将是完全相同的。