langyo_v3
没错我是langyo= =
怎么喂龙请去末地看申诉…

最近,我那个压缩算法就要出炉了,但在写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++程序的内存模型。

通常而言,一个程序在运行的时候分为四个区:

如果是诸如下面这样的类型声明时分配内存:
  1. char c[450] = {0};
复制代码
那么相应的内存属于静态内存会被分配到栈区。
如果是像楼主提到的那样的使用new申请内存:
  1. char *c = new char[450];
复制代码
那么相应的内存属于动态内存会被分配到堆区。

不过楼主似乎提到了变长数组?就像这样:
  1. #include <cstdlib>
  2. int i = std::rand() & 0xff;
  3. char c[i];
复制代码
这种情况下,程序会按照给定的值自动在栈上分配相应长度的数组。
不过,楼主你问的这玩意,真的和MC有关么。。。

langyo_v3
本帖最后由 langyo_v3 于 2017-4-7 07:06 编辑
ustc_zzzz 发表于 2017-4-7 01:55
希望不要出现v4
楼主感兴趣的话可以看看C++程序的内存模型。

变长数组的格式究竟是怎样的?我总是搞混

(跟MC有那么一丁点关系,因为我之前用命令方块实现了变长数组OOC)

(我也不希望需要再注册,但有人抢注咋办XD)

qqabxiaojing
讲真,我没听懂你在描述什么,不过从你的描述知道你是一个大新手,首先
第一个问题,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++不是类型安全的  可以强转 取决于你想写什么进去

langyo_v3
qqabxiaojing 发表于 2017-4-7 10:12
讲真,我没听懂你在描述什么,不过从你的描述知道你是一个大新手,首先
第一个问题,new/delete   malloc/free  ...

我主要还是用java比较熟练,c++只不过是用在算法考试的工具罢了

其实malloc已经够用了,毕竟new更应当用在面向对象,它还能因为class的特性而支持构造和析构

问题我已经自行解决了

Yaossg
你讲的话非常不清楚,但是我可以明确告诉你几点
1.不管是什么时候new都是c++最好选择
2.最好不要自己动手操作指针,尤其是在c++中,可以考虑STL里提供的泛型类(STL是c++标准库的一部分)
3.如果非要操作指针,切记销毁数组时用delete[]而不是delete
4.显然你没有搞懂怎么使用new。。。那你最好参见第二条
5.你在网上收集的资料明显略有偏颇,但更多是你自己的问题,参见第四条
6.不要妄图使用可变长度的数组,那会把问题变复杂
如果你想要更多了解c++,尤其是对上面建议不清楚的,或者想要我教你怎么解决你的问题
可以私信我,这里因为篇幅原因就不详细说了。
我也可以收个c++学徒什么的,反正学了这么久c++也是闲的慌

langyo_v3
姚氏帅哥 发表于 2017-4-7 12:40
你讲的话非常不清楚,但是我可以明确告诉你几点
1.不管是什么时候new都是c++最好选择
2.最好不要自己动手操 ...

我需要动态数组的原因,是为了动态实现分区块
new的基础格式,我只有这个疑惑,现在已经完美解决了(刚刚用学校电脑测试了,编译通过)
至于你觉得我对new运算符理解得不够透彻…我更偏向java,但java里到处都是new,再怎么不会也得被这种环境整会了啊…
其实,写算法时都不需要这动态数组,因为人家题目会给数据范围…

c++学徒?…算了算了= =你倒不如跟我说说怎么在NOI突破到全国竞赛…

WA自动机
langyo_v3 发表于 2017-4-7 13:27
我需要动态数组的原因,是为了动态实现分区块
new的基础格式,我只有这个疑惑,现在已经完美解决了(刚刚用学 ...

C++的new和java的new差别可不止一点,如果完全照搬java的思维可是会出事的。

顺便orz 切NOI的dalao

langyo_v3
WA自动机 发表于 2017-4-8 12:29
C++的new和java的new差别可不止一点,如果完全照搬java的思维可是会出事的。

顺便orz 切NOI的dalao ...

C++的类比java的放荡,多继承什么的,太可恶了XD
而且new了必须自己delete,确实和java不同

但照搬,就算想也做不到,因为C++可以直接操作指针,java则围绕类做了一堆事情

至于NOI呐,说实话,原理不难,但编的时候难,因为要考虑最短时间复杂度XD

Smokey_Days
langyo_v3 发表于 2017-4-8 13:08
C++的类比java的放荡,多继承什么的,太可恶了XD
而且new了必须自己delete,确实和java不同

如果是java的话可以用集合然后集合←→数组互转即可
但是C++有集合这个功能么?我不是很清楚,因为学C++同样是为了NOIP
另:NOIP取消对JAVA的支持真是太可恶了
另2:你是哪个省区的XD运气好说不定我们会碰面呢

langyo_v3
Smokey_Days 发表于 2017-4-16 17:37
如果是java的话可以用集合然后集合←→数组互转即可
但是C++有集合这个功能么?我不是很清楚,因为学C++ ...

江苏的XD
所以今年11月见?XD

java比起C++,好用太多了,只是性能有所欠缺罢了
我手里还有个java虚拟机规范的PDF文档,如果真的可能,拿这东西给自己的启动器实现内嵌虚拟机也不是不好XD

Yaossg
langyo_v3 发表于 2017-4-8 13:08
C++的类比java的放荡,多继承什么的,太可恶了XD
而且new了必须自己delete,确实和java不同

你不用多继承不就不可恶了么
new的确需要自己delete
但是c++程序员会利用构造函数new利用析构函数delete
还可以加个计数器什么的灵活度速度都比java高
加上泛型几乎和Java的差不多了

Yaossg
本帖最后由 姚氏帅哥 于 2017-4-16 18:23 编辑
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;//方括号里面是键,等号右面是值

langyo_v3
姚氏帅哥 发表于 2017-4-16 18:10
你不用多继承不就不可恶了么
new的确需要自己delete
但是c++程序员会利用构造函数new利用析构函数delete

那个…C++那个不叫泛型…叫虚函数…

Yaossg
langyo_v3 发表于 2017-4-16 18:20
那个…C++那个不叫泛型…叫虚函数…

你确定?你了解c++?c++用模板实现泛型好吗

Yaossg
langyo_v3 发表于 2017-4-16 18:20
那个…C++那个不叫泛型…叫虚函数…

你之前问关于c++动态内存的时候我就回答过你
看得出来你非常迫切想要参加noip(其实我也想)
但是,就目前而言,你用Java的方式理解c++
相当的不好,最后你的脑袋会拧成麻花
你对我进行指正,说泛型是虚函数
然而这并不是Java中的伪泛型,不是靠的是语法糖
不是靠把T换成Object等做法构成的“多态泛型”
c++泛型与继承、多态、虚函数没有半毛钱关系
所以你看到了c++泛型与Java的泛型是不能相提并论的
还有,需要指出的是,Java除了静态方法之外
其他方法都是虚函数,而c++不同需要手动指定

langyo_v3
姚氏帅哥 发表于 2017-4-16 21:41
你之前问关于c++动态内存的时候我就回答过你
看得出来你非常迫切想要参加noip(其实我也想)
但是,就目前 ...

额,NOI早着呢,隔一暑假急啥

java的泛型是语法糖,编译时自动匹配数据类型,C++也是一样的么?

第一页 上一页 下一页 最后一页