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

时间:2014-08-12 11:53:53

标签: c++ string memory-management

#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

3 个答案:

答案 0 :(得分:6)

问题是您是否正在尝试使用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 ++的假设。

答案 1 :(得分:2)

至于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)变量,为什么要这样做呢?只需重用现有变量即可。

答案 2 :(得分:0)

TempName有一个指向字符串的指针。尝试在使用前添加*以进行解除引用:

getline(std::cin, *TempName);

或者您也可以提前使用字符串而不是指向它的指针:

int main()
{
    std::string myString;
    std::getline(std::cin, myString);

    // Do something with the string you just read
}