这是我一直想知道的事情,从来没有找到答案:
为什么当你在堆上分配一些东西时,你无法仅通过指针来确定它的大小,但是你可以仅使用指针来删除它,不知何故C++知道要释放多少字节?
这与它在堆上的存储方式有关吗?这些信息是否存在但C++没有公开?
也许这应该是一个单独的问题,但我认为它非常相关所以我会在这里问:
为什么必须使用delete []简单的delete命令来删除动态的元素数组; 为什么C++需要这些额外的信息才能正确释放所有内存?
在使用许多标准C库函数的一些Microsoft安全版本时,我注意到这些函数中的一些似乎能够在编译时确定传入缓冲区是静态还是动态分配的.如果输入缓冲区是静态分配的,则函数可以自动地确定它的大小,但如果是动态的,则必须将该大小作为另一个参数给出.
例如,当静态分配缓冲区时,此段代码有效:
char buffer[1024];
sprintf_s(buffer, "Hello World\n");
printf_s(buffer);
Run Code Online (Sandbox Code Playgroud)
但是这个没有:
char *buffer = new char[1024];
sprintf_s(buffer, "Hello World\n");
printf_s(buffer);
Run Code Online (Sandbox Code Playgroud)
我已经尝试过查看这些函数的定义,但代码主要是预处理程序定义,试图遵循这些定义非常容易混淆.
所以我的问题是:这是如何确定的,这是一个标准的C/C++语言功能还是某种微软特定的功能?
其中一些函数似乎没有意义,就像printf_s()具有与printf()完全相同的函数定义,那么为什么他们甚至有这个呢?
如果有人能够对此有所启发,我会很感激.