我正在读一本出现以下代码的书。
TTextInBuffer::TTextInBuffer(const char *pInputFileName, TAbortCode ac)
: pFileName(new char[strlen(pInputFileName) + 1])
pFileName
被声明为const char,所以我假设第二行在pFileName
中创建了一个新的char。我想知道发生了什么的具体细节。感谢。
答案 0 :(得分:2)
调用此构造函数时,将执行此处的初始化列表:
: pFileName(new char[strlen(pInputFileName) + 1])
strlen()
调用根据其内容查找pInputFileName
字符串的长度。它基本上将它作为char数组运行,直到找到NULL
,然后返回结果。这样做是为了计算pFileName
内新字符串所需的空间。
+ 1
用于确保最后有额外NULL
终止字符的空间。
最后,使用关键字new
将弹出的表达式中的任何数字输入内存分配调用。这会在字符串数据结束的堆上动态分配内存。 new
调用返回已分配内存的地址,并将其传递给pFileName
指针变量,以便它指向它。
所以,总结一下:
pInputFileName
的长度new
为副本请求空间new
返回的地址已分配给pFileName
您的代码中缺少的一件事是将输入字符串的内容实际复制到目标,但可能在构造函数体内发生(在{
和}
个字符之间)。
答案 1 :(得分:0)
第二行通过调用operator char
来分配内存区域(new[]
s的数组)。
new
的参数是要分配的数组的大小。因此,在此片段中,长度设置为字符串pInputFileName
+ 1的长度。此+ 1
用于拟合在C和C ++中用于确定字符串结束位置的空字符。