标签: stack

如何防止在堆上创建对象?

有没有人知道我怎么能在平台无关的C++代码中阻止在堆上创建对象?也就是说,对于"Foo"类,我想阻止用户这样做:

Foo *ptr = new Foo;
Run Code Online (Sandbox Code Playgroud)

并且只允许他们这样做:

Foo myfooObject;
Run Code Online (Sandbox Code Playgroud)

有没有人有任何想法?

干杯,

c++ heap stack

26
推荐指数
3
解决办法
8478
查看次数

堆栈上的局部变量分配顺序

看看这两个功能:

void function1() {
    int x;
    int y;
    int z;
    int *ret;
}

void function2() {
    char buffer1[4];
    char buffer2[4];
    char buffer3[4];
    int *ret;
}
Run Code Online (Sandbox Code Playgroud)

如果我打破function1()gdb,并打印变量的地址,我得到这个:

(gdb) p &x  
$1 = (int *) 0xbffff380
(gdb) p &y
$2 = (int *) 0xbffff384
(gdb) p &z
$3 = (int *) 0xbffff388
(gdb) p &ret
$4 = (int **) 0xbffff38c
Run Code Online (Sandbox Code Playgroud)

如果我做同样的事情function2(),我得到这个:

(gdb) p &buffer1
$1 = (char (*)[4]) 0xbffff388
(gdb) p &buffer2
$2 = (char (*)[4]) …
Run Code Online (Sandbox Code Playgroud)

c memory x86 stack gcc

26
推荐指数
4
解决办法
2万
查看次数

Haskell编译器如何决定是在堆还是堆栈上进行分配?

Haskell没有显式内存管理功能,所有对象都是按值传递的,所以也没有明显的引用计数或垃圾回收.Haskell编译器通常如何决定是否生成在堆栈上分配的代码与在堆上为给定变量分配的代码?是否一致堆或堆栈为同一个函数在不同的调用站点分配相同的变量?当它分配时,它如何决定何时释放内存?堆栈分配和解除分配是否仍在与C中相同的功能入口/出口模式中执行?

compiler-construction heap stack haskell memory-management

26
推荐指数
1
解决办法
4053
查看次数

char*str ="STRING"和char str [] ="STRING"之间的区别?

在编写一个简单的函数来从字符串中删除特定字符时,我遇到了这个奇怪的问题:

void str_remove_chars( char *str, char to_remove)
{
    if(str && to_remove)
    {
       char *ptr = str;
       char *cur = str;
       while(*ptr != '\0')
       {
           if(*ptr != to_remove)
           {
               if(ptr != cur)
               {
                   cur[0] = ptr[0];
               }
               cur++;
           }
           ptr++;
       }
       cur[0] = '\0';
    }
}
int main()
{
    setbuf(stdout, NULL);
    {
        char test[] = "string test"; // stack allocation?
        printf("Test: %s\n", test);
        str_remove_chars(test, ' '); // works
        printf("After: %s\n",test);
    }
    {
        char *test = "string test";  // non-writable?
        printf("Test: %s\n", …
Run Code Online (Sandbox Code Playgroud)

c arrays string stack pointers

25
推荐指数
2
解决办法
3万
查看次数

在python脚本中设置stacksize

我正在将csh脚本转换为python脚本.该脚本调用内存密集型可执行文件,需要非常大的堆栈,因此csh脚本将stacksize设置为unlimited:

limit stacksize unlimited
Run Code Online (Sandbox Code Playgroud)

当我尝试在python中重现这个脚本时,我以一种非常天真的方式执行它们os.system,例如:

os.system('some_executable')
Run Code Online (Sandbox Code Playgroud)

但我不知道如何通过无限制的堆栈大小来告诉操作系统运行这些可执行文件.有没有办法为python脚本中的调用指定stacksize?是否有一些我应该使用的低级系统调用?是否有一个控制它的模块(类似于shutil)?

python stack csh

25
推荐指数
3
解决办法
3万
查看次数

将值从本地堆栈移动到堆?(C++)

如何从方法调用中获取对象值作为结果并将其放在堆上?

例如:

Qt QImage::scaledToWidth方法返回QImage对象的副本.

现在我正在做:

QImage *new_img_on_heap = new QImage(old_imgage_on_heap->scaledToWidth(2000));
Run Code Online (Sandbox Code Playgroud)

这是唯一的方法吗?看起来它已经经历了制作第三个全新物体的麻烦,当我已经在堆栈上有一个完美的好物品时.

我想把它放在堆上的原因是因为真实QImage的很大,我希望它比当前方法的生命周期更长.我打算在我班上的一个字段中填充指针.

我知道QImage有一些隐含的数据共享,但我并不清楚它是如何工作的.另外,我想知道一个通​​用的解决方案,如果我需要使用不像Qt那样精心设计的对象.

c++ heap stack

25
推荐指数
2
解决办法
9747
查看次数

ArrayDeque vs ArrayList实现堆栈

文档ArrayDeque说:

当用作堆栈时,此类可能比Stack快,并且当用作队列时比LinkedList更快.

没有提到使用ArrayDeque堆栈和使用堆栈之间的区别ArrayList.您可以使用ArrayList如下堆栈作为堆栈.

list.add(object);                      // push
object = list.remove(list.size() - 1); // pop
Run Code Online (Sandbox Code Playgroud)

我发现当我只用ArrayList这种方式时,它的性能比它差ArrayDeque.这种差异的原因是什么?当然,它不仅仅是电话size()?在内部,都ArrayListArrayDeque使用的是实现Object[]由更大的阵列需要时更换,所以可靠地性能应该是大约相同的?

java stack arraylist arraydeque

25
推荐指数
1
解决办法
1万
查看次数

Android完成Activity并启动另一个

我很好奇一件事.我怎样才能完成当前的活动并开始另一个活动.

示例:

MainActivity
    --(starts)--> LoginActivity
        --(if success, starts)--> SyncActivity
            --(if success start)--> MainActivity (with updated data).
Run Code Online (Sandbox Code Playgroud)

所以我想在成功同步后SyncActivity开始MainActivity,如果我按回按钮不返回SyncActivity或之前打开的任何其他活动SynActivity.

我试过这段代码:

Intent intent = new Intent(Synchronization.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);
this.finish();
Run Code Online (Sandbox Code Playgroud)

但它不能正常工作.任何想法如何使事情正常工作?

stack android android-activity

24
推荐指数
1
解决办法
3万
查看次数

如何在python中的另一个类的函数内获取调用者类名?

我的目标是为此激发应用程序的序列图我需要在运行时有关调用者和被调用者类名的信息.我可以成功检索调用函数但无法获取调用者类名称?

#Scenario caller.py:

import inspect

class A:

    def Apple(self):
        print "Hello"
        b=B()
        b.Bad()



class B:

    def Bad(self):
        print"dude"
        print inspect.stack()


a=A()
a.Apple()
Run Code Online (Sandbox Code Playgroud)

当我打印堆栈时,没有关于调用者类的信息.那么可以在运行时检索调用者类吗?

python stack runtime sequence-diagram

24
推荐指数
4
解决办法
2万
查看次数

C++:Stack的push()vs emplace()

试图理解使用push()emplace()for 之间的区别std::stack.

我在想,如果我创建一个std::stack<int>,那么我会使用push()因为整数是一种原始类型而且没有任何东西emplace()需要构造.

但是,如果我正在创建,std::stack<string>那么我会选择emplace()因为std::string是一个对象.

这是正确的用法吗?

c++ stack

24
推荐指数
2
解决办法
2万
查看次数