使用cin和operator>>直接分配内存

时间:2014-08-26 09:35:03

标签: c++ memory-management cin

我第一次看到这种语法:cin >> (ptr = new char);

这是一种动态分配内存的可靠方法吗?有什么可能的陷阱?

int main()
{
    char* charPtr;

    std::cout << "Enter a string: ";
    std::cin.getline((charPtr = new char), 5);//What's happening here?

    std::cout << charPtr << "\n";
    std::cout << "length: " << strlen(charPtr) << "\n";

    std::cin.clear();///Clearing eventually errors flags

    //Ignoring remained chars of the buffer.
    std::cin.ignore(std::numeric_limits<int>::max(), '\n');

    delete [] charPtr;//freeing memory

    std::cout << "Enter a word: ";
    std::cin >> (charPtr = new char);//ALLOCATING MEMORY FOR 1 CHAR

    std::cout << charPtr << "\n";
    std::cout << "length: " << strlen(charPtr) << "\n";

    delete [] charPtr;//CRASH

    return 0;
}

1 个答案:

答案 0 :(得分:4)

std::cin.getline((charPtr = new char), 5);

这只为一个字符分配空间,必须由空终止符占用。因此,如果用户在此行上输入任何字符,则会导致缓冲区溢出,未定义的行为。

delete [] charPtr;

未定义的行为,因为您分配了new,而不是new[]

std::cin >> (charPtr = new char);

保证缓冲区溢出,除非用户终止标准输入(例如在Windows上使用ctrl-z),因为这将至少读取一个字符,并存储至少2个(读取的字符,加上null)终止子)。

delete [] charPtr;

我想你现在可以猜到这是什么。