一个关于自定义new的问题

Ians_Huyu 2012-10-22 05:52:13
首先是这个问题:
e75d5bcf7167.htmlhttp://topic.csdn.net/u/20121022/11/af7bc053-b07a-41ee-8282-e75d5bcf7167.html
,没有获得答案~如果有知道的朋友还请指教;
其次是一个类中重写new的问题:
一个类包含一个double数组,这个数组是靠一个double*成员来引用的,如果自己重写new,怎么获得重写后new表达式返回的指针呢?如果说不需要获得指针,那么如何为这个double*赋值初始化呢~多谢各位帮助~
...全文
251 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ians_Huyu 2012-10-24
  • 打赏
  • 举报
回复
并且,希望将这个类的所有对象连同它们所包装的每一个数组作为整体分配到内存池中,因为查缺补漏贴膏药的方法虽然很多,但对系统设计不利[Quote=引用 15 楼 的回复:]
class CSB
{
public:
static double * m;

CSB(int nLength){
if (!m)
m=new double[nLength];
}
}

这符合只申请一块内存的要求吧?
[/Quote]
Ians_Huyu 2012-10-24
  • 打赏
  • 举报
回复
哥们看来我需要详细跟你讲一下问题,你还是没明白我的意思~:
做数据采集中,每次采集出来的数组有长有短,并带有附加信息,用一个类去包装这个数组,那么这个类的对象内附加信息的空间需求是已知的,但是数组大小是不确定的,如果用自定义的new operator,虽然能将类似CSB的所有对象分配到内存池中,也可以根据所需空间申请每个单独对象的大小,但是,每个对象内的m所引用的位置无法得知,因此无法在构造函数内使用memcpy。这就是全部的问题,提炼出来就是:如何在一个类的构造函数中获得该对象已分配内存的首地址,虽然this是首地址,但是由于虚表是否存在?不安全:安全。[Quote=引用 15 楼 的回复:]
class CSB
{
public:
static double * m;

CSB(int nLength){
if (!m)
m=new double[nLength];
}
}

这符合只申请一块内存的要求吧?
[/Quote]
Ians_Huyu 2012-10-24
  • 打赏
  • 举报
回复
哥们看来我需要详细跟你讲一下问题,你还是没明白我的意思~:
做数据采集中,每次采集出来的数组有长有短,并带有附加信息,用一个类去包装这个数组,那么这个类的对象内附加信息的空间需求是已知的,但是数组大小是不确定的,如果用自定义的new operator,虽然能将类似CSB的所有对象分配到内存池中,也可以根据所需空间申请每个单独对象的大小,但是,每个对象内的m所引用的位置无法得知,因此无法在构造函数内使用memcpy。这就是全部的问题,提炼出来就是:如何在一个类的构造函数中获得该对象已分配内存的首地址,虽然this是首地址,但是由于虚表是否存在?不安全:安全。
傻X 2012-10-23
  • 打赏
  • 举报
回复
不理解为什么要重写new啊?
你自己重写构造函数不就可以了?就能满足你所有的变化了。

难道你需要的是:

double * p = wokao double;

p就初始化好了?
小兵_小白 2012-10-23
  • 打赏
  • 举报
回复
double*p = new double(n);这里就是你分配的堆中的内存。你想初始化,在给他memset即可。
儿女情长 2012-10-23
  • 打赏
  • 举报
回复
第二个问题,看你需要在堆还是栈中分配内存了,在栈中分配就直接在类中定义固定长度的数组即可。
gfm688 2012-10-23
  • 打赏
  • 举报
回复

class CSB
{
public:
static double * m;

CSB(int nLength){
if (!m)
m=new double[nLength];
}
}

这符合只申请一块内存的要求吧?
Ians_Huyu 2012-10-23
  • 打赏
  • 举报
回复
但是this指针不太好,不太安全,用起来没法计算偏移量[Quote=引用 10 楼 的回复:]

路过,准备绕行

重写new,那叫运算符重载

引用 6 楼 的回复:
new只能申请一块内存,至于该内存返回的指针,如何交给构造函数!

不就是this吗?
[/Quote]
Ians_Huyu 2012-10-23
  • 打赏
  • 举报
回复
只有你的答案是认真看过的,其他回答全是没怎么看的,表示感谢吧[Quote=引用 12 楼 的回复:]

不好意思,没看清楚,我以为new一个类
[/Quote]
gfm688 2012-10-23
  • 打赏
  • 举报
回复
不好意思,没看清楚,我以为new一个类
Ians_Huyu 2012-10-23
  • 打赏
  • 举报
回复
还停留在概念阶段呢,看来必然绕行了[Quote=引用 10 楼 的回复:]

路过,准备绕行

重写new,那叫运算符重载

引用 6 楼 的回复:
new只能申请一块内存,至于该内存返回的指针,如何交给构造函数!

不就是this吗?
[/Quote]
gfm688 2012-10-23
  • 打赏
  • 举报
回复
路过,准备绕行

重写new,那叫运算符重载

[Quote=引用 6 楼 的回复:]
new只能申请一块内存,至于该内存返回的指针,如何交给构造函数!
[/Quote]
不就是this吗?
Ians_Huyu 2012-10-23
  • 打赏
  • 举报
回复
很合适![Quote=引用 8 楼 的回复:]

引用 6 楼 的回复:
对重写new有异议的绕行!
对不知道重写new的绕行!
对不知道有几种new的绕行!


我绕行
[/Quote]
傻X 2012-10-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
对重写new有异议的绕行!
对不知道重写new的绕行!
对不知道有几种new的绕行!
[/Quote]

我绕行
Ians_Huyu 2012-10-23
  • 打赏
  • 举报
回复
见楼上![Quote=引用 4 楼 的回复:]

不理解为什么要重写new啊?
你自己重写构造函数不就可以了?就能满足你所有的变化了。

难道你需要的是:

double * p = wokao double;

p就初始化好了?
[/Quote]
Ians_Huyu 2012-10-23
  • 打赏
  • 举报
回复
细致的说是这样的!!

class CSB
{
public:
CSB(int nLength){
m=new double[nLength];
}
private:
double * m;
}
这个类的对象,频繁的产生和销毁!为效率!!!!!!!!!!!!重写类中operator new!也就是new CSB();之后的CSB构造函数怎么知道new操作符返回的指针!new只能申请一块内存,至于该内存返回的指针,如何交给构造函数!!!!
对重写new有异议的绕行!
对不知道重写new的绕行!
对不知道有几种new的绕行!

[Quote=引用 3 楼 的回复:]

double*p = new double(n);这里就是你分配的堆中的内存。你想初始化,在给他memset即可。
[/Quote]
Ians_Huyu 2012-10-23
  • 打赏
  • 举报
回复
无语,你看我问这问题和你回答的在一个层次上么~[Quote=引用 2 楼 的回复:]

第二个问题,看你需要在堆还是栈中分配内存了,在栈中分配就直接在类中定义固定长度的数组即可。
[/Quote]
Ians_Huyu 2012-10-22
  • 打赏
  • 举报
回复
顶..

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧