我对在堆上分配对象与在堆栈上分配对象,以及何时以及如何调用 delete() 的主题有点困惑。
例如,我有 Vector 类。我想制作一个数组。
我可以这样做
Vector** v = new Vector*[100]; //create an array of 100 pointers to 100 Vector objects
据我所知,这会在堆上分配所有内容(指针地址除外)? 所以要释放内存,我需要:
for (int i = 0; i < 100; ++i)
{
delete(v[i]);
}
delete(v);
或者只是
delete(v);
够了吗?
现在另一个例子:
Vector* v = Vector[100];
在这种情况下发生了什么?分配发生在哪里?堆还是栈? 我还需要打电话吗
delete(v);
但这不是全部问题,抱歉发帖太长了..
例子:
class Vector
{
int x, y, z;
}
Vector* v = new Vector();
x, y, z 分配在哪里?堆还是栈?
或者这个怎么样:
class Vector2
{
int items[10];
}
Vector2* v2 = new Vector2();
项目[10] 分配在哪里? 如何删除 v2?我需要自定义析构函数吗?
还有最后但并非最不重要的一点:
class Vector3
{
int* items;
}
Vector3 v3 = Vector3();
项目指针存储在哪里?堆还是栈?我该如何删除它?
感谢并抱歉问了这么长的问题。很长一段时间以来,我一直在为这个问题烦恼,并且无法在网上找到任何完整的解释。
最佳答案
我将从头开始......
Vector** v = new Vector*[100];
在堆上分配一个包含 100 个指向 Vector 类型对象的指针的数组 它返回一个指针 - v - 您可以使用它来跟踪这个指针数组。
使用以下命令删除这个包含 100 个点的数组:
delete[] v;
(使用delete 运算符 - delete 用于单个分配的对象,delete[] 用于数组)
下一个案例(我假设你的意思是 new Vector[100]:
Vector* v = new Vector[100];
您在堆上分配了一个包含 100 个 Vector 的数组,并获得了一个指向其起始位置的指针 - v。 删除这个数组:
delete[] v;
下一步...
class Vector
{
int x, y, z;
}
Vector* v = new Vector();
这会在堆上分配一个 Vector 类的对象,并为您提供一个指针来跟踪它。因为你把整个对象都分配到了堆上,所以x、y、z都分配到了堆上。
删除它:
delete v;
class Vector2
{
int items[10];
}
Vector2* v2 = new Vector2();
这个有点棘手,但我会推理出来...
类是蓝图。在以某种方式实例化该类之前,您根本没有分配任何内存,在本例中是在堆上。因为该类是蓝图,所以在您在堆上创建类 Vector2 的对象之前,无法分配 items。我认为我们可以合理地推断出 items 是在堆上分配的。
删除 v2:
delete v2;
最后:
class Vector3
{
int* items;
}
Vector3 v3 = Vector3();
您在堆栈上分配了所有 Vector3 类,其中的指针 items 也因此分配。堆上没有任何内容,所以不要删除它。
关于c++ - 堆与堆栈分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6713637/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
通过rubykoans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John
我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
假设您在Ruby中执行此操作:ar=[1,2]x,y=ar然后,x==1和y==2。是否有一种方法可以在我自己的类中定义,从而产生相同的效果?例如rb=AllYourCode.newx,y=rb到目前为止,对于这样的赋值,我所能做的就是使x==rb和y=nil。Python有这样一个特性:>>>classFoo:...def__iter__(self):...returniter([1,2])...>>>x,y=Foo()>>>x1>>>y2 最佳答案 是的。定义#to_ary。这将使您的对象被视为要分配的数组。irb>o=Obje
我正在使用Dragonfly在Rails3.1应用程序上处理图像。我正在努力通过url将图像分配给模型。我有一个很好的表格:{:multipart=>true}do|f|%>RemovePicture?Dragonfly的文档指出:Dragonfly提供了一个直接从url分配的访问器:@album.cover_image_url='http://some.url/file.jpg'但是当我在控制台中尝试时:=>#ruby-1.9.2-p290>picture.image_url="http://i.imgur.com/QQiMz.jpg"=>"http://i.imgur.com/QQ
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“
使用Paperclip,我想从这样的URL抓取图像:require'open-uri'user.photo=open(url)问题是我最后得到一个像“open-uri20110915-4852-1o7k5uw”这样的文件名。有什么方法可以更改user.photo上的文件名?作为一个额外的变化,Paperclip将我的文件存储在S3上,所以如果我可以在初始分配中设置我想要的文件名就更好了,这样图像就会上传到正确的S3key。像这样:user.photo=open(url),:filename=>URI.parse(url).path 最佳答案
这是我理想中想要的。用户做:a="hello"输出为Youjustallocated"a"!=>"Hello"顺序无关紧要,只要我能实现该消息即可。 最佳答案 不,没有直接的方法可以做到这一点,因为在执行代码之前,Ruby字节码编译器会丢弃局部变量名。YARV(MRI1.9.2中使用的RubyVM)提供的关于局部变量的唯一指令是getlocal和setlocal,它们都对整数索引进行操作,而不是变量名。以下是1.9.2源代码中insns.def的摘录:/****************************************