C ++ On Demand Creation

时间:2011-05-29 03:25:31

标签: c++

我正在读一本出现以下代码的书。

TTextInBuffer::TTextInBuffer(const char *pInputFileName, TAbortCode ac)
: pFileName(new char[strlen(pInputFileName) + 1])

pFileName被声明为const char,所以我假设第二行在pFileName中创建了一个新的char。我想知道发生了什么的具体细节。感谢。

2 个答案:

答案 0 :(得分:2)

调用此构造函数时,将执行此处的初始化列表:

: pFileName(new char[strlen(pInputFileName) + 1])

strlen()调用根据其内容查找pInputFileName字符串的长度。它基本上将它作为char数组运行,直到找到NULL,然后返回结果。这样做是为了计算pFileName内新字符串所需的空间。

+ 1用于确保最后有额外NULL终止字符的空间。

最后,使用关键字new将弹出的表达式中的任何数字输入内存分配调用。这会在字符串数据结束的堆上动态分配内存。 new调用返回已分配内存的地址,并将其传递给pFileName指针变量,以便它指向它。

所以,总结一下:

  1. 计算pInputFileName的长度
  2. 计算出的长度增加1,以满足副本中的NULL
  3. 调用
  4. new为副本请求空间
  5. new返回的地址已分配给pFileName
  6. 您的代码中缺少的一件事是将输入字符串的内容实际复制到目标,但可能在构造函数体内发生(在{}个字符之间)。

答案 1 :(得分:0)

第二行通过调用operator char来分配内存区域(new[] s的数组)。

new的参数是要分配的数组的大小。因此,在此片段中,长度设置为字符串pInputFileName + 1的长度。此+ 1用于拟合在C和C ++中用于确定字符串结束位置的空字符。