SemenTalonov:
也就是说,在第一种情况下,m_A[0] 不会是堆栈对象'a'的副本 ,而是指向该本地对象 的 某个POINTER_AUTOMATIC 类型的指针,该指针在退出函数后将成为POINTER_INVALID 类型(如果它是从其他函数调用的)?
如果使用不当,任何东西都可能成为无效的。重点不是POINTER_INVALID,而是自动创建的对象也会被自动删除。
在任何情况下,都不能在这里创建一个对象的副本。指针只是一个指针--一个带有数字的变量,表示对象的位置,在本例中是对象 "a"。所以,你可以用 "a "来指代对象 "a",也可以用 "m_A[0]",这是一个对象,不是两个不同的对象。
原则很简单:你创造了这个对象,就自己删除它。如果你没有创造它,就不要管它。就这么简单。
反之亦然。一个POINTER_DYNAMIC 类型的指针可以分配给一个POINTER_AUTOMATIC类型 的指针。但这是正确的,也是好的--它开启了很多可能性。
一个物体的副本从何而来?指针的拷贝,是的,但指向同一个对象。
MT5构建1940
它在这两种情况下都能编译。
在第一种情况下,输出是一个没有被删除的对象(新创建的)和一个内存泄漏
好的,手动释放......然后编译器(突然)注意到数组包含非指针:"预计是对象指针"
好的,我把它声明为一个指针数组。
A* m_A[2];
它可以编译!这对我来说是个新闻。那么,MQL到底有没有指针?因为对于像char、int等内置类型,会有
'*' - pointer cannot be used
但这次将是在运行时。
这在原则上是符合逻辑的)。
关于这个结果有一些问题。
1.如果这些子指针不能像C/C++中的指针那样发挥其主要功能,那么MQL中的这些子指针有什么用?
2.如果MT知道确切的字节数,并且可以自动释放内存,那么我们为什么要玩删除呢?