内存分配/解除分配问题 [英] memory allocation/deallocation question

查看:91
本文介绍了内存分配/解除分配问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我意识到这不是最好的代码,但是我正在使用类似于以下内容的

legcy系统进行维护...

class Foo

{

// ...

}


int main()

{

char * p_char = new char [5000];


// p_char充满数据从插座中读取


Foo * p_foo =(Foo *)p_char;


// p_foo在这里使用...


删除p_foo;

}


假设Foo小于5000 * sizeof(char),这会导致

内存泄漏?或者删除调用是否知道分配的内存比sizeof(Foo)更多,并且做了正确的事情?

解决方案

BigBrian写道:


假设Foo小于5000 * sizeof(char),会导致内存泄漏吗?或者删除调用是否知道分配的内存比sizeof(Foo)更多,并做正确的事情?




无论如何都不保证。这样做:


p_foo-> ~Foo(); //销毁对象

delete [] p_char; //释放记忆


-


Pete Becker

Dinkumware,Ltd。( http://www.dinkumware.com


Pete Becker< pe ******** @ acm.org>在新闻中写道:pOudnZ0dm6lIn87fRVn-
hg@rcn.net

BigBrian写道:< blockquote class =post_quotes>
假设Foo小于5000 * sizeof(char),会导致内存泄漏吗?或者删除调用是否知道分配的内存比sizeof(Foo)更多,并做正确的事情?



无论如何都不保证。这样做:

p_foo-> ~Foo(); //销毁对象
delete [] p_char; //释放记忆




即使这样也不安全。请注意,没有提到* p_foo已经构建了
!并且,不是OP的东西未定义的行为

无论如何......他正在对内存进行删除,这是新的[]'ed(忽略了

他也在切换类型......)。


Andre Kostur写道:


即便如此不安全。请注意,没有提到* p_foo已经构建过了!


还没有被提及与没有发生并不相同。我很愿意明确假设读入的数据产生了一个正确初始化的对象。但是如果你想问他这件事,请继续。

并且,不是OP的东西未定义的行为
无论如何...他正在删除在内存上是新的[]''ed(忽略了他也在切换类型......)。




这可能是什么& ;无论如何都不保证是什么意思?


-


Pete Becker

Dinkumware,Ltd。( http://www.dinkumware.com


I realize this isn''t the best code, but I''m doing maintenance on a
legcy system that has something similar to the following...

class Foo
{
//...
}

int main()
{
char * p_char = new char[5000];

// p_char gets filled with data read from a socket

Foo * p_foo = (Foo *) p_char;

// p_foo gets used here...

delete p_foo;
}

Assuming Foo is smaller than 5000 * sizeof(char), will this result in a
memory leak? Or will the call to delete know that more memory was
allocated than sizeof(Foo), and do the right thing?

解决方案

BigBrian wrote:


Assuming Foo is smaller than 5000 * sizeof(char), will this result in a
memory leak? Or will the call to delete know that more memory was
allocated than sizeof(Foo), and do the right thing?



No guarantees either way. Do it like this:

p_foo->~Foo(); // destroy object
delete [] p_char; // free the memory

--

Pete Becker
Dinkumware, Ltd. (http://www.dinkumware.com)


Pete Becker <pe********@acm.org> wrote in news:pOudnZ0dm6lIn87fRVn-
hg@rcn.net:

BigBrian wrote:


Assuming Foo is smaller than 5000 * sizeof(char), will this result in a
memory leak? Or will the call to delete know that more memory was
allocated than sizeof(Foo), and do the right thing?



No guarantees either way. Do it like this:

p_foo->~Foo(); // destroy object
delete [] p_char; // free the memory



Even that''s not safe. Note that it hasn''t been mentioned that *p_foo has
ever been constructed! And, isn''t the OP''s stuff undefined behaviour
anyway... he''s doing a delete on memory that was new[]''ed (ignoring that
he''s switching types too...).


Andre Kostur wrote:


Even that''s not safe. Note that it hasn''t been mentioned that *p_foo has
ever been constructed!
"Hasn''t been mentioned" is not the same as "hasn''t happened." I''m
willing to make the obvious assumption that the data read in produces a
properly initialized object. But if you want to ask him about it, go ahead.
And, isn''t the OP''s stuff undefined behaviour
anyway... he''s doing a delete on memory that was new[]''ed (ignoring that
he''s switching types too...).



Could that be what "No guarantees either way" means?

--

Pete Becker
Dinkumware, Ltd. (http://www.dinkumware.com)


这篇关于内存分配/解除分配问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆