4

我想知道下面的代码是如何工作的。

#include <iostream>
using namespace std;
int main()
{
    char* buffer = new char(NULL);
    while(true)
    {
        cin >> buffer;
        cout << buffer;
        cout << endl;
    }
    return 0;
}

我可以输入任意数量的任意大小的文本,它会将其打印回给我。这是如何运作的?它是否为我动态分配空间?

此外,如果我输入一个空格,它将在新行上打印下一部分文本。然而,这可以通过使用gets(buffer);(unsafe) 来解决。

另外,这段代码“合法”吗?

4

2 回答 2

5

这根本不安全。它正在重写缓冲区之后发生的任何内存,然后读取它。这有效的事实是巧合。这是因为您的 cin/cout 操作不会说“哦,指向一个字符的指针,我应该只写一个字符”而是“哦,你有足够的空间分配给我”。

改进#1:

char* buffer = new char(10000)或者干脆char buffer[10000]

现在您可以毫无问题地安全地编写较长的段落。

改进#2:

std::string buffer;

为了在评论中回答您的问题,C++ 完全是为了让您犯下大的内存错误。如评论中所述,这是因为它是一种“不要为不需要的东西付费”的语言。有些人确实需要在他们的代码中进行这种级别的优化,尽管您可能不是其中之一。

但是,它也为您提供了很多无需考虑内存的方法。我会坚定地说:如果您使用newanddelete或 char[] 而不是因为您使用的是您熟悉的需要它们的设计模式,或者因为您使用的是需要它们的 3rd-party 或 C 库,那么有一种更安全的方法。

一些可以节省 80% 时间的指南:

- 不要使用字符 []。使用字符串。

- 不要使用指针来传递或返回参数。按引用传递,按值返回。

- 不要使用数组(例如 int[])。使用向量。您仍然必须检查自己的界限。

只需这三个,您就可以编写“相当安全”的非 C 类代码。

于 2012-05-30T12:44:59.700 回答
3

std::string是为了:

std::string s;

while (true)
{
    std::cin >> s;
    std::cout << s << std::endl;
}

std::string将为您动态分配空间,因此您不必担心会覆盖其他地方的内存。

于 2012-05-30T12:48:17.800 回答