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

0 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;
}
Run Code Online (Sandbox Code Playgroud)

嗨,我是新来的.我正在尝试创建一个简单的过程,玩家可以为其分配名称Cfriend,但问题是它不会让我分配cinTempName.

我希望能够TempName在完成后立即从内存中删除.

Jon*_*ely 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;
}
Run Code Online (Sandbox Code Playgroud)

我希望能够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;
}
Run Code Online (Sandbox Code Playgroud)

tempName 在结束括号中超出范围并且其内存被释放.

如果你真的,真的无法重新安排这样的代码,你仍然可以强制string解除它拥有的内存:

    std::string tempName;
    // ...
    tempName.clear();
    tempName.shrink_to_fit();
Run Code Online (Sandbox Code Playgroud)

当每个评论者都告诉你要new明确停止使用时,这应该是一个非常重要的暗示,可以重新评估你对编写优秀C++的假设.