我正在阅读一本书,其中出现了以下代码。
TTextInBuffer::TTextInBuffer(const char *pInputFileName, TAbortCode ac)
: pFileName(new char[strlen(pInputFileName) + 1])
pFileName
声明为 const char,因此我假设第二行在 pFileName
中创建了一个新的 char。我只想知道正在发生的事情的细节。谢谢。
最佳答案
当调用此构造函数时,将执行此处的初始化列表:
: pFileName(new char[strlen(pInputFileName) + 1])
strlen()
调用根据其内容查找 pInputFileName
字符串的长度。它基本上将它作为一个 char 数组遍历,直到找到 NULL
,然后返回结果。这样做是为了计算 pFileName
中新字符串所需的空间。
+ 1
用于确保末尾有额外的 NULL
终止符。
最后,无论从该表达式中弹出什么数字,都会使用关键字 new
送入内存分配调用。这会在字符串数据最终所在的堆上动态分配内存。 new
调用返回已分配内存的地址,并将其传递给 pFileName
指针变量,以便它指向它。
总结一下:
- 计算
pInputFileName
的长度 - 计算的长度增加 1 以适应拷贝中的 NULL
new
被调用为拷贝申请空间new
返回的地址赋值给pFileName
您的代码中缺少的一件事是将输入字符串的内容实际复制到目的地,但也许这发生在构造函数体内(在 {
和 之间) }
个字符)。
关于C++ 按需创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6165762/