#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
。
答案 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
}