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
,但问题是它不会让我分配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;
}
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++的假设.
归档时间: |
|
查看次数: |
77 次 |
最近记录: |