首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

到底能不能编写一个只能在栈上创建对象的类解决方法

2012-03-12 
到底能不能编写一个只能在栈上创建对象的类最近,只堆只栈的问题有频频出现,以前没有仔细考虑过只是照着前

到底能不能编写一个只能在栈上创建对象的类
最近,只堆只栈的问题有频频出现,以前没有仔细考虑过只是照着前人的写便是了。

刚看了一篇博文,里面用的方法也是如此。

大致代码如下:

C/C++ code
#include <iostream>using std::cout;using std::endl;class OnlyHeap   {public:    OnlyHeap();     private:    ~OnlyHeap();};class OnlyStack   {public:    OnlyStack();private:    void* operator new(size_t);};OnlyStack o;/* 满足不了只能在栈上创建对象 */int main(){    return 0;}


问题是就上例和三大存储区域而言,我想问的是只在栈上创建对象的类,在数据区不是也可以创建吗?

这样一来,到底有没有既能在栈上创建又不让在数据区创建的方法?



[解决办法]
这个问题我觉得是:
class OnlyHeap
{
public:
OnlyHeap();

private:
~OnlyHeap();
};

题目只要求只在堆中分配或不在堆中分配。

这样可以阻止在栈中分配,也阻止了delete函数,所以这样的解法也是不太合理的,要另外用一个函数来delete;


class OnlyStack
{
public:
OnlyStack();

private:
void* operator new(size_t);
};

这样的解法也是不能阻止在堆中分配的。
OnlyStack* ps = (OnlyStack*)malloc(sizeof(OnlyStack));
ps->OnlyStack();

OK,分配完了。
[解决办法]
探讨
引用:

placement new 应该是全局的那个。否则就当是对象里面的那个。

C/C++ code



#include <iostream>
#include <memory>
using namespace std;

class A
{
public:

A()
:a(111)
{
cout<<"构……

[解决办法]
VS 2008 试试这个吧。

C/C++ code
#include <iostream>#include <memory>using namespace std;class A{public:        A()        :a(111)    {        cout<<"构造A"<<endl;    }     ~A()    {        cout<<"析构A"<<endl;    }    int a;private:    void* operator new (size_t t){};    void  operator delete(void *ptr){    std::cout<<"op delete"<<std::endl;        };    };int main(){    A* ps = (A*)malloc(sizeof(A));    ::new(ps) A();    std::cout<<ps->a<<std::endl;        ps->~A();//很奇怪这里不能单步跟踪进去。    free(ps);    system("pause");    return 0;}
[解决办法]
探讨

引用:

引用:
这个代码假设的东西太多了。


所以说不严谨嘛,严谨的做法就是搜索栈数据,判断this是否在栈中。


我认为这个问题这样想,有点跑偏了,我们说不能在哪里创建,指的是如若违反规定编译时会出错,可是这些个判断this的想法,是不是运行时才能做到的呢?

热点排行