Nim*_*ima 28 c++ memory-management object new-operator
这是我的示例代码:
void test()
{
Object1 *obj = new Object1();
.
.
.
delete obj;
}
Run Code Online (Sandbox Code Playgroud)
我在Visual Studio中运行它,它在'delete obj;'的行中崩溃.这不是释放与对象关联的内存的正常方法吗?我意识到它会自动调用析构函数......这是正常的吗?
这是一段代码:
if(node->isleaf())
{
vector<string> vec = node->L;
vec.push_back(node->code);
sort(vec.begin(), vec.end());
Mesh* msh = loadLeaves(vec, node->code);
Simplification smp(msh);
smp.simplifyErrorBased(errorThreshold);
int meshFaceCount = msh->faces.size();
saveLeaves(vec, msh);
delete msh;
}
Run Code Online (Sandbox Code Playgroud)
loadleaves()是一个从磁盘读取网格并创建一个Mesh对象并返回它的函数.(想想vec并且node->code只是有关要打开的文件的信息)
我应该删除该delete msh;线路吗?
Jam*_*lis 37
这不是释放与对象关联的内存的正常方法吗?
这是管理动态分配内存的常用方法,但这不是一种好方法.这种代码很脆弱,因为它不是异常安全的:如果在创建对象和删除对象之间抛出异常,则会泄漏该对象.
使用智能指针容器会更好,您可以使用它来获取范围限制资源管理(它通常称为资源获取是初始化,或RAII).
作为自动资源管理的示例:
void test()
{
std::auto_ptr<Object1> obj1(new Object1);
} // The object is automatically deleted when the scope ends.
Run Code Online (Sandbox Code Playgroud)
根据您的使用情况,auto_ptr可能无法提供您需要的语义.在这种情况下,您可以考虑使用shared_ptr.
至于为什么你的程序在删除对象时崩溃,你没有给出足够的代码,任何人都无法确定地回答这个问题.
您的代码确实使用常规方法来创建和删除动态对象.是的,完全正常(并且确实由语言标准保证!)delete将调用对象的析构函数,就像new调用构造函数一样.
如果你没有Object1直接实例化它的某些子类,我会提醒你,任何想要继承的类都必须有一个虚析构函数(这样就可以在类似于这个的情况下调用正确的子类的析构函数) - 但是如果您的示例代码确实代表了您的实际代码,那么这可能不是您当前的问题 - 必须是其他内容,可能是您未向我们展示的析构函数代码,或者您未显示的代码中的某些堆损坏在那个功能或它所称的那个......?
顺便说一句,如果您在退出实例化它的函数之前总是要删除对象,那么使该对象动态化没有意义 - 只需将其声明为本地(存储类auto,默认情况下)变量功能!
| 归档时间: |
|
| 查看次数: |
141802 次 |
| 最近记录: |