尝试从内存中删除字符串。不会让我分配给cin

Trying to delete string from memory. Won't let me assign to cin

本文关键字:分配 cin 内存 字符串 删除      更新时间:2023-10-16
#include "stdafx.h"
#include "Cfriend.h"
int _tmain(int argc, _TCHAR* argv[])
{
    std::string * TempName = new std::string;
    std::cout << "Name your friend:n";
    std::getline (std::cin, TempName);
    Cfriend * MyFriend = new Cfriend();
    return 0;
}
嗨,我是新来的。我试图创建一个简单的过程,玩家可以将名称分配给Cfriend,但问题是,它不会让我将cin分配给TempName

我希望能够从内存中删除TempName一旦我完成了它。

问题是您正在尝试使用std::string*,而std::string是预期的。

最好的解决方案是不要使用new来创建每个对象,c++不是Java或c#。

#include "Cfriend.h"
int main(int argc, char* argv[])
{
    std::string tempName;
    std::cout << "Name your friend:n";
    std::getline (std::cin, tempName);
    Cfriend myFriend;
    return 0;
}

我希望能够从内存中删除TempName一旦我完成了它。

为什么?名字会有几千字节长吗?

如果必须销毁它,则让std::string析构函数销毁它:

#include "Cfriend.h"
int main(int argc, char* argv[])
{
    Cfriend myFriend;
    {
        std::string tempName;
        std::cout << "Name your friend:n";
        std::getline (std::cin, tempName);
        myFriend.setName(tempName);
    }
    return 0;
}

tempName在右括号处超出作用域,其内存被释放。

如果真的,真的不能像这样重新排列代码,你仍然可以强制string释放它拥有的内存:

    std::string tempName;
    // ...
    tempName.clear();
    tempName.shrink_to_fit();

当每个评论者都明确地告诉你停止使用new时,这应该是一个相当大的提示,重新评估你对编写好的c++的假设。

对于TempString的销毁,它一旦离开作用域就会被销毁。

意味着你可以这样写:

int main()
{
    // Some code...
    {
        std::string temp;
        std::getline(std::cin, temp);
        // Do something with the string `temp`
    }
    // No `temp` string object, it doesn't exist, and has been destructed
    // More code...
}
这里最大的问题是为什么要呢?除非您希望在一行中有几兆字节的输入文本,否则临时变量的作用域实际上是没有用的。如果您想重新声明temp(或TempString)变量,为什么要这样做呢?只需重用现有的变量。

TempName有一个指向字符串的指针。当使用它时,尝试在它前面添加一个*来解引用:

getline(std::cin, *TempName);

或者你也可以直接使用字符串而不是指向它的指针:

int main()
{
    std::string myString;
    std::getline(std::cin, myString);
    // Do something with the string you just read
}