动态分配字符数组(智能指针)

时间:2018-10-10 16:38:26

标签: arrays c++11 smart-pointers

我正在尝试根据用户输入(例如,

)使用智能指针在c ++中动态分配字符数组
std::cout<<"Input a word: ";
std::cin>>std::unique_ptr<char[]>ch_array(new char[]);

因此,当用户输入字符串时,它仅消耗必要的字节数。由于它一直给我一个错误,是否有其他解决方法来获得这样的结果?

2 个答案:

答案 0 :(得分:0)

一些问题:

  • 您不能拥有大小未知的数组,必须始终创建一个具有大小的数组。
  • 您不能在所有上下文中声明或定义变量,例如通用表达式的一部分。
  • std::unique_ptr对象仍然是std::unique_ptr对象,没有内置的转换运算符可以转换为所指向的类型,这意味着它不能直接用作目标对象。格式化的输入运算符。

答案 1 :(得分:0)

如果您不想使用std :: string或任何其他标准容器(如先前建议的那样),则基本上有两种选择:

直截了当-预先分配缓冲区,足够存储输入

std::cout << "Input a word: ";
char ch_array[100];
std::cin >> ch_array;

非常复杂的一个-按符号读取输入并重新分配内存

的原因,重新分配投放很多。而且我不建议使用它,除非内存是极其有限的资源,并且您甚至不能花费额外的数据字节。只是为了说明它可能有多复杂:

char* ch_array;
static int count = 0;
char c = getchar();

while(c != '\n')
{
    if( count == 0)
        ch_array = static_cast<char*>( malloc( sizeof(char)+1 ) );
    else
        ch_array = static_cast<char*>( realloc(ch_array, sizeof(char)*(count+2) ) );

    ch_array[count] = c;

    count++;
    c = getchar();
}
ch_array[count] = '\0';

在此代码中,也跳过了错误检查,这对于重新分配是绝对必要的。有了它们,它将变得更加复杂

标题中的 智能指针 似乎与以下问题无关:

使用第一个选项,您可以在堆上分配缓冲区并使用它:

std::unique_ptr<char[]> ch_array(new char[100]);

第二步,您需要一个自定义删除器,如此处Is it possible to use a C++ smart pointers together with C's malloc?

所述