没错我是langyo= =
怎么喂龙请去末地看申诉…
最近,我那个压缩算法就要出炉了,但在写C++版的算法时遇到了问题,问题出在动态内存分配上。
众所周知,要声明一个静态数组,其初始化下标必须是一个常量表达式。动态数组则比较有趣了,它需要你给个指针,然后new,动态开辟空间,用完后还得delete。
现在的问题是,我的压缩算法需要能够动态调整的内存空间,但理论来讲数组下限如果用变量会满屏Error红灿灿。如何才能以new申请出我动态指定量的内存?
别急着回复,我还没讲完。
我使劲查了资料,发现其实大家都是可以这么玩的,以变量为下限来new。不过,我看见的都是诸如char p*=new bytes[i];这种玩意。所以,其它数据类型不行,但char可以喽?如果不行,那GCC又是怎么做的呢?怎么才能做到用new动态申请内存?
最后,可能有人要我用malloc()和free(),也可能有人要我改用文件流替代数组,也可能有人建议我用链表、堆或向量…但我希望能用new,这个面向对象的产物,而不是一堆库,那太依赖系统了(不用反驳,库确实有一定依赖性,各系统GCC的实现不一样)。
感谢你能抽出时间听我扯皮,也希望你能给我建设性的回复。
怎么喂龙请去末地看申诉…
最近,我那个压缩算法就要出炉了,但在写C++版的算法时遇到了问题,问题出在动态内存分配上。
众所周知,要声明一个静态数组,其初始化下标必须是一个常量表达式。动态数组则比较有趣了,它需要你给个指针,然后new,动态开辟空间,用完后还得delete。
现在的问题是,我的压缩算法需要能够动态调整的内存空间,但理论来讲数组下限如果用变量会满屏Error红灿灿。如何才能以new申请出我动态指定量的内存?
别急着回复,我还没讲完。
我使劲查了资料,发现其实大家都是可以这么玩的,以变量为下限来new。不过,我看见的都是诸如char p*=new bytes[i];这种玩意。所以,其它数据类型不行,但char可以喽?如果不行,那GCC又是怎么做的呢?怎么才能做到用new动态申请内存?
最后,可能有人要我用malloc()和free(),也可能有人要我改用文件流替代数组,也可能有人建议我用链表、堆或向量…但我希望能用new,这个面向对象的产物,而不是一堆库,那太依赖系统了(不用反驳,库确实有一定依赖性,各系统GCC的实现不一样)。
感谢你能抽出时间听我扯皮,也希望你能给我建设性的回复。
本帖最后由 ustc_zzzz 于 2017-4-7 02:06 编辑
希望不要出现v4
楼主感兴趣的话可以看看C++程序的内存模型。
通常而言,一个程序在运行的时候分为四个区:
如果是诸如下面这样的类型声明时分配内存:
复制代码那么相应的内存属于静态内存会被分配到栈区。
如果是像楼主提到的那样的使用new申请内存:
复制代码那么相应的内存属于动态内存会被分配到堆区。
不过楼主似乎提到了变长数组?就像这样:
复制代码这种情况下,程序会按照给定的值自动在栈上分配相应长度的数组。
不过,楼主你问的这玩意,真的和MC有关么。。。
楼主感兴趣的话可以看看C++程序的内存模型。
通常而言,一个程序在运行的时候分为四个区:
- 常量区,用于存放常量数据,包括字符串等
- 数据区,用于存放全局变量等静态数据
- 栈区,用于管理静态分配的内存,包括函数参数等
- 堆区,用来管理动态分配的内存
如果是诸如下面这样的类型声明时分配内存:
- char c[450] = {0};
如果是像楼主提到的那样的使用new申请内存:
- char *c = new char[450];
不过楼主似乎提到了变长数组?就像这样:
- #include <cstdlib>
- int i = std::rand() & 0xff;
- char c[i];
不过,楼主你问的这玩意,真的和MC有关么。。。
本帖最后由 langyo_v3 于 2017-4-7 07:06 编辑
变长数组的格式究竟是怎样的?我总是搞混
(跟MC有那么一丁点关系,因为我之前用命令方块实现了变长数组OOC)
(我也不希望需要再注册,但有人抢注咋办XD)
ustc_zzzz 发表于 2017-4-7 01:55
希望不要出现v4
楼主感兴趣的话可以看看C++程序的内存模型。
变长数组的格式究竟是怎样的?我总是搞混
(跟MC有那么一丁点关系,因为我之前用命令方块实现了变长数组OOC)
(我也不希望需要再注册,但有人抢注咋办XD)
讲真,我没听懂你在描述什么,不过从你的描述知道你是一个大新手,首先
第一个问题,new/delete malloc/free 这个你就没搞懂什么时候该用哪个, new 他内部除了调用malloc外还调了构造函数 而malloc就只是申请内存。所以如果你单单只是存储一些数据完全可以用malloc, new也可以随你选择没什么区别反正我boss要求我写c++代码不管做什么都用new。
第二个问题 其实你没必要过多关注于数据类型,如果你只是想存储,那么你只需要知道你需要多少内存。比如我要申请12个字节内存 void*p = new char[12]; 或者 void *p = new int[3]; 当然语法需要强转,这里我只是大概写一下。得到12个字节的p你可以往里面写任意的东西 比如写个对象进去写什么都可以,C++不是类型安全的 可以强转 取决于你想写什么进去
第一个问题,new/delete malloc/free 这个你就没搞懂什么时候该用哪个, new 他内部除了调用malloc外还调了构造函数 而malloc就只是申请内存。所以如果你单单只是存储一些数据完全可以用malloc, new也可以随你选择没什么区别反正我boss要求我写c++代码不管做什么都用new。
第二个问题 其实你没必要过多关注于数据类型,如果你只是想存储,那么你只需要知道你需要多少内存。比如我要申请12个字节内存 void*p = new char[12]; 或者 void *p = new int[3]; 当然语法需要强转,这里我只是大概写一下。得到12个字节的p你可以往里面写任意的东西 比如写个对象进去写什么都可以,C++不是类型安全的 可以强转 取决于你想写什么进去
qqabxiaojing 发表于 2017-4-7 10:12
讲真,我没听懂你在描述什么,不过从你的描述知道你是一个大新手,首先
第一个问题,new/delete malloc/free ...
我主要还是用java比较熟练,c++只不过是用在算法考试的工具罢了
其实malloc已经够用了,毕竟new更应当用在面向对象,它还能因为class的特性而支持构造和析构
问题我已经自行解决了
你讲的话非常不清楚,但是我可以明确告诉你几点
1.不管是什么时候new都是c++最好选择
2.最好不要自己动手操作指针,尤其是在c++中,可以考虑STL里提供的泛型类(STL是c++标准库的一部分)
3.如果非要操作指针,切记销毁数组时用delete[]而不是delete
4.显然你没有搞懂怎么使用new。。。那你最好参见第二条
5.你在网上收集的资料明显略有偏颇,但更多是你自己的问题,参见第四条
6.不要妄图使用可变长度的数组,那会把问题变复杂
如果你想要更多了解c++,尤其是对上面建议不清楚的,或者想要我教你怎么解决你的问题
可以私信我,这里因为篇幅原因就不详细说了。
我也可以收个c++学徒什么的,反正学了这么久c++也是闲的慌
1.不管是什么时候new都是c++最好选择
2.最好不要自己动手操作指针,尤其是在c++中,可以考虑STL里提供的泛型类(STL是c++标准库的一部分)
3.如果非要操作指针,切记销毁数组时用delete[]而不是delete
4.显然你没有搞懂怎么使用new。。。那你最好参见第二条
5.你在网上收集的资料明显略有偏颇,但更多是你自己的问题,参见第四条
6.不要妄图使用可变长度的数组,那会把问题变复杂
如果你想要更多了解c++,尤其是对上面建议不清楚的,或者想要我教你怎么解决你的问题
可以私信我,这里因为篇幅原因就不详细说了。
我也可以收个c++学徒什么的,反正学了这么久c++也是闲的慌
姚氏帅哥 发表于 2017-4-7 12:40
你讲的话非常不清楚,但是我可以明确告诉你几点
1.不管是什么时候new都是c++最好选择
2.最好不要自己动手操 ...
我需要动态数组的原因,是为了动态实现分区块
new的基础格式,我只有这个疑惑,现在已经完美解决了(刚刚用学校电脑测试了,编译通过)
至于你觉得我对new运算符理解得不够透彻…我更偏向java,但java里到处都是new,再怎么不会也得被这种环境整会了啊…
其实,写算法时都不需要这动态数组,因为人家题目会给数据范围…
c++学徒?…算了算了= =你倒不如跟我说说怎么在NOI突破到全国竞赛…
langyo_v3 发表于 2017-4-7 13:27
我需要动态数组的原因,是为了动态实现分区块
new的基础格式,我只有这个疑惑,现在已经完美解决了(刚刚用学 ...
C++的new和java的new差别可不止一点,如果完全照搬java的思维可是会出事的。
顺便orz 切NOI的dalao
WA自动机 发表于 2017-4-8 12:29
C++的new和java的new差别可不止一点,如果完全照搬java的思维可是会出事的。
顺便orz 切NOI的dalao ...
C++的类比java的放荡,多继承什么的,太可恶了XD
而且new了必须自己delete,确实和java不同
但照搬,就算想也做不到,因为C++可以直接操作指针,java则围绕类做了一堆事情
至于NOI呐,说实话,原理不难,但编的时候难,因为要考虑最短时间复杂度XD
langyo_v3 发表于 2017-4-8 13:08
C++的类比java的放荡,多继承什么的,太可恶了XD
而且new了必须自己delete,确实和java不同
如果是java的话可以用集合然后集合←→数组互转即可
但是C++有集合这个功能么?我不是很清楚,因为学C++同样是为了NOIP
另:NOIP取消对JAVA的支持真是太可恶了
另2:你是哪个省区的XD运气好说不定我们会碰面呢
Smokey_Days 发表于 2017-4-16 17:37
如果是java的话可以用集合然后集合←→数组互转即可
但是C++有集合这个功能么?我不是很清楚,因为学C++ ...
江苏的XD
所以今年11月见?XD
java比起C++,好用太多了,只是性能有所欠缺罢了
langyo_v3 发表于 2017-4-8 13:08
C++的类比java的放荡,多继承什么的,太可恶了XD
而且new了必须自己delete,确实和java不同
你不用多继承不就不可恶了么
new的确需要自己delete
但是c++程序员会利用构造函数new利用析构函数delete
还可以加个计数器什么的灵活度速度都比java高
加上泛型几乎和Java的差不多了
本帖最后由 姚氏帅哥 于 2017-4-16 18:23 编辑
c++的确有合集。。。我不可能详细的说
但是最常用,最好用的是vector
大概像这样
std::vector<int> v = {1,2,3};
v.push_back(4);//在末尾插入4
for(int n : v)std::cout<<n;//它会输出1234
当然还有map
std::map<std::string,int> m;
m["hello"]=4;//方括号里面是键,等号右面是值
Smokey_Days 发表于 2017-4-16 17:37
如果是java的话可以用集合然后集合←→数组互转即可
但是C++有集合这个功能么?我不是很清楚,因为学C++ ...
c++的确有合集。。。我不可能详细的说
但是最常用,最好用的是vector
大概像这样
std::vector<int> v = {1,2,3};
v.push_back(4);//在末尾插入4
for(int n : v)std::cout<<n;//它会输出1234
当然还有map
std::map<std::string,int> m;
m["hello"]=4;//方括号里面是键,等号右面是值
姚氏帅哥 发表于 2017-4-16 18:10
你不用多继承不就不可恶了么
new的确需要自己delete
但是c++程序员会利用构造函数new利用析构函数delete
那个…C++那个不叫泛型…叫虚函数…
langyo_v3 发表于 2017-4-16 18:20
那个…C++那个不叫泛型…叫虚函数…
你确定?你了解c++?c++用模板实现泛型好吗
langyo_v3 发表于 2017-4-16 18:20
那个…C++那个不叫泛型…叫虚函数…
你之前问关于c++动态内存的时候我就回答过你
看得出来你非常迫切想要参加noip(其实我也想)
但是,就目前而言,你用Java的方式理解c++
相当的不好,最后你的脑袋会拧成麻花
你对我进行指正,说泛型是虚函数
然而这并不是Java中的伪泛型,不是靠的是语法糖
不是靠把T换成Object等做法构成的“多态泛型”
c++泛型与继承、多态、虚函数没有半毛钱关系
所以你看到了c++泛型与Java的泛型是不能相提并论的
还有,需要指出的是,Java除了静态方法之外
其他方法都是虚函数,而c++不同需要手动指定
姚氏帅哥 发表于 2017-4-16 21:41
你之前问关于c++动态内存的时候我就回答过你
看得出来你非常迫切想要参加noip(其实我也想)
但是,就目前 ...
额,NOI早着呢,隔一暑假急啥
java的泛型是语法糖,编译时自动匹配数据类型,C++也是一样的么?
langyo_v3 发表于 2017-4-16 21:45
额,NOI早着呢,隔一暑假急啥
java的泛型是语法糖,编译时自动匹配数据类型,C++也是一样的么? ...
Java泛型最重要的一个环节就是“类型擦除”
把所有涉及泛型的地方换成Object
在加上一些强制类型转换,所以Java泛型不支持基本类型
因为他们不能实现上述内容
在这里不具体讲,你可以在论坛里找一下Java泛型研究
c++不同,实际上c++的泛型是通过“模板”(template)实现的
template是一个巨坑,一般教程只教泛型这部分(甚至泛型都只讲这一部分)
这里不想详细的说,其实你可以私信我的。。。那样交流顺畅些
参考STL库,比如动态数组去看看vector底层的实现,也算是比较权威的
该运算符将返回一个指针,详情还请你去百度上查找资料。链表是依靠new和delete实现的。malloc()类似new,free()类似delete。
zcm2005 发表于 2017-5-8 20:54
该运算符将返回一个指针,详情还请你去百度上查找资料。链表是依靠new和delete实现的。malloc()类似new,fr ...
链表同样可以通过malloc()与free()实现,只不过不是很方便罢了
new/delete与malloc()/free()最明显的不同,是new/delete在初始化class时自动帮你执行构造和析构,但malloc()/free()得你自己费事手动执行