Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在程序启动时将动态内存分配更改为预分配_C++ - Fatal编程技术网

C++ 在程序启动时将动态内存分配更改为预分配

C++ 在程序启动时将动态内存分配更改为预分配,c++,C++,我有一个叫做shape的类和一些派生类,比如圆、矩形、多边形(最大8点) 点结构包含x和y作为坐标 所以对于圆,它包含一个_点和半径;矩形包含2个U点,多边形包含8个U点 每次创建对象时,都会使用“新建”分配内存,当更改/编辑为不同的形状类型时,将删除该对象,释放内存并为新形状分配新内存 这将导致碎片,因为我在嵌入式系统上使用它。 因此,当程序开始使用最大形状的new时(例如10份poly,10份是用户可以创建的最大形状),当用户为第三个项目创建一个圆形时,我会预先分配内存,我只会键入特定的内存

我有一个叫做shape的类和一些派生类,比如圆、矩形、多边形(最大8点)

点结构包含x和y作为坐标

所以对于圆,它包含一个_点和半径;矩形包含2个U点,多边形包含8个U点

每次创建对象时,都会使用“新建”分配内存,当更改/编辑为不同的形状类型时,将删除该对象,释放内存并为新形状分配新内存

这将导致碎片,因为我在嵌入式系统上使用它。 因此,当程序开始使用最大形状的new时(例如10份poly,10份是用户可以创建的最大形状),当用户为第三个项目创建一个圆形时,我会预先分配内存,我只会键入特定的内存块。这可行吗?C++可以接受像普通C那样的类型化以及如何在C++中完成它。只有在程序结束时才会释放内存


谢谢。

这不是一个干净的设计,只是你想做什么的暗示。其思想是将所有可能形状的所有数据需求保留在基类中,并使用派生类根据形状的类型实现行为

struct _Point
{
    float x, y;
};

class Data
{
    protected:
        _Point points[8];  //max 8 as required.
};

class Behaviour_1 : public Data
{
    public:
    void Set(_Point x, _Point y)
    {
        points[0] = x;
        points[1] = y;
    }
    void Draw()
    {
        //use points[0] and points[1]
        cout << "Drawing Line ----" << endl;
        cout << "X coordinates: " << points[0].x << ", " << points[0].y << endl;
        cout << "Y coordinates: " << points[1].x << ", " << points[1].y << endl;
    }
};

class Behaviour_2 : public Data
{
    public:
    void Set(_Point x, float radius)
    {
        points[0] = x;
        points[1].x = radius;
    }

    void Draw()
    {
        //use points[0] and points[1].x
        cout << "Drawing Circle ----" << endl;
        cout << "Center coordinates: " << points[0].x << ", " << points[0].y << endl;
        cout << "Radius : " << points[0].x << endl;
    }
};

int main() 
{
    // your code goes here
    _Point x = {10, 20};
    _Point y = {30, 50};
    float radius = 60.0f;

    Data shape;
    Behaviour_1 *Line = (Behaviour_1 *)(&shape);
    Line->Set(x, y);
    Line->Draw();

    Behaviour_2 *Cicle = (Behaviour_2 *)(&shape);
    Cicle->Set(x, radius);
    Cicle->Draw();

    return 0;
}

Output:
Drawing Line ----
X coordinates: 10, 20
Y coordinates: 30, 50
Drawing Circle ----
Center coordinates: 10, 20
Radius : 10
struct\u点
{
浮动x,y;
};
类数据
{
受保护的:
_点数[8];//根据需要最多8个。
};
类行为_1:公共数据
{
公众:
空集(_点x,_点y)
{
点[0]=x;
点[1]=y;
}
作废提款()
{
//使用点[0]和点[1]

你可以使用placement new来使用预先分配的内存块吗?我相信使用你选择的“C++自定义内存分配器”搜索引擎将为您提供足够的文献和示例,以供入门。您好,请阅读。您能提供一些代码吗?。至于类型转换:您可以在使用继承时尝试。您可以重载new和delete运算符。这有点麻烦,但它让您对在何处使用内存进行低级控制。这真的很糟糕。upcAST是UB(如果您需要任何子类中的成员,它将真正崩溃),您在每个非多边形中浪费了一堆点。@Caleth:您已经提到,只有行为才能由派生类实现,而派生类本身没有任何数据。所有的数据要求都在基类中。上传仍然没有定义。符合要求的编译器可以对您的示例执行任何操作。@Caleth:Its向下投射,而不是向上投射。无论如何,正确的做法是通过动态投射进行向下投射会失败。“C型”投射锅。请参阅更新的答案。无论如何,它的设计很糟糕。投射“有效”因为它是一个
重新解释
到另一个类型。即UB。你的形状不是行为1,也不是行为2,你不能移植到这些类型