Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.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
在函数中malloc全局变量是错误的吗? 我在C++中有两个简单的问题。_C++_Global Variables_Malloc - Fatal编程技术网

在函数中malloc全局变量是错误的吗? 我在C++中有两个简单的问题。

在函数中malloc全局变量是错误的吗? 我在C++中有两个简单的问题。,c++,global-variables,malloc,C++,Global Variables,Malloc,1-我想使一个变量被类中的某些方法共享,所以我要做的是在头文件中声明该变量,并使其成为类的全局变量。因此,所有方法都可以访问它。这样做对吗 2-在我的第一点之后,如果我在标题中将变量N声明为double*N。然后在我的方法中,我做到了 N = (double*) malloc (sizeof(double)*50); 我知道N将在函数中分配内存。我的问题是:这个内存是只保留在函数内部还是一直保留在全局N中 如果没有为N保留内存,则此方法将不是一个好方法,因为系统可能会在以后的程序中覆盖N的值

1-我想使一个变量被类中的某些方法共享,所以我要做的是在头文件中声明该变量,并使其成为类的全局变量。因此,所有方法都可以访问它。这样做对吗

2-在我的第一点之后,如果我在标题中将变量
N
声明为
double*N
。然后在我的方法中,我做到了

N = (double*) malloc (sizeof(double)*50);
我知道
N
将在函数中分配内存。我的问题是:这个内存是只保留在函数内部还是一直保留在全局
N

如果没有为
N
保留内存,则此方法将不是一个好方法,因为系统可能会在以后的程序中覆盖
N
的值

敬请指教,谢谢


编辑:谢谢大家的输入和编辑我的问题。显然,我错误地将变量称为全局变量,而它实际上是类成员。我认为这个声明称为global,因为变量对于类中的方法是全局的。希望下次我能问一个更聪明的问题:)

根据我作为程序员的经验,我从不在头文件中实例化变量。 相反,我可以在C文件中实例化该变量,但可以在外部(在头文件中)使用它,以便其他类可以使用它。但是如果你想申报,应该没问题

当你说malloc时,你是说N有这个尺寸。 但是,如果您没有malloc它,并且尝试在不同的方法中使用它,那么您将有一个分段错误,因为没有为它分配空间(这只适用于指针、列表、数组等。您不需要为单个数据类型执行此操作)

N可以在任何地方实例化,但在使用之前必须实例化

  • 不,避免全球性的。为变量找到正确的范围和封装。把它放在那里

  • 如果您将某物声明为
    double
    ,并尝试为其分配指针,则不会发生任何事情。您的代码根本无法编译。我想你说的是一个全局的
    double*
    。您需要为该指针使用
    malloc
    内存,它与作用域末尾的
    malloc
    not
    free
    d一样。你需要自己去做,但这对于一个全球性的公司来说可能不那么重要

  • 我就到此为止。有这么多错误。在C++中不应该使用<代码> MalOC < /COD>。你不应该在C++中使用简单的数组。你应该尽可能避免使用globals。您更应该用代码说明您正在尝试做什么

  • 是的,这是正确的方法
  • 如果要使用动态分配的内存,则应将N声明为“double*”而不是“double”。此外,在C++中使用“新”而不是“MALLC”。虽然您尚未使用“删除”发布N bu,但它将是全局可用的,因此它将保持全局性,而不在函数的范围内
    malloc
    的内存将保持有效,直到您
    释放它。然而,这是一个非常糟糕的设计。从技术上讲,这是合法和正确的。然而,这绝对不是正确的方法。首先,全局变量是不好的。如果您有一个设计,并且它包含一个全局变量,请仔细考虑,直到它不包含为止。其次,您应该使用
    new
    delete
    和智能指针,而不是
    malloc
    free
    。第三,只是让它成为类的成员变量?

    这不是C++中类数据成员的构造和管理的惯用方式。通常,您将按如下方式声明对象:

    class foo
    {
    public:
      foo() : N(0.) {}  // initialize N in the ctor
      // interface
    private:
      // data
      double N;
    };
    

    现在
    foo
    中的所有方法都可以读取/修改(取决于
    const
    ness)成员
    N
    。您不需要手动管理
    N
    的存储,它是作为
    foo
    实例的一部分进行管理的。除非希望
    foo
    的所有实例及其成员使用相同的
    N
    ,否则不需要单独的“全局”变量。即使如此,它是动态的也是没有意义的。

    作为一般规则,你应该避免使用全局变量,除非绝对没有其他解决方案可用(如果软件设计良好,这种情况永远不会发生)

  • 如果你说的“全球”是指作为成员,像这样

    甲级 { 私人: 双N; };

  • 那么是的

    如果全局的意思是这样的(哪一个AFAIK是全局变量的正确概念)

    然后应该避免这种情况,并使用上一个(将变量用作类成员)

  • 您的示例毫无意义,因为double已经有了一个大小。您需要将指针与malloc()一起使用,例如双精度N*。此外,由于您正在C++编程,因此使用新的。由new(推荐)或malloc()(不推荐)分配的所有内存将保留,除非您手动释放它(当不再需要该内存时,您不应忘记这样做)

  • 让我们把事情弄清楚一点。假设这是在header
    members.h中:

    extern double a;     // this is a "global" variable declaration. It needs a definition.
    
    class B {
      double c;          // this is a data member. There will be one in each object of class B
      static double * d; // this is a static data member. There will be a single one for
                         // all objects of class B. It needs a definition.
    public:
      void f() { c = 1.0; a = 3.0; }           // A member function can access both static and
                                               // plain data members, as well as globals.
      static void g() { d = new double(2.0); } // A static member function can only access
                                               // static data members and globals.
    };
    
    请注意,像
    a
    c
    这样的变量/数据成员不需要显式分配。另一方面,
    d
    会,因为它是一个指针。请注意,在C++中,使用<代码>新()>代码>而不是<代码> MalCube()> <代码> > < /P> 这是源文件
    members.cpp

    #include "members.h"
    
    double a; // Definition of global a
    
    double * B::d;  // Definition for static member d
    
    B b1;     // Static instance of class B
    
    int main() {
      B b2;      // Local instance of class B
      b1.f();    // Calling member function f() on b1
      b2.f();    // Calling member function f() on b2
      B::g();    // Calling static member function g()
    }
    

    我希望我已经说得够清楚了,并且已经回答了您的疑问。

    发布一些代码示例来澄清您的问题将对试图回答的人有所帮助。是否有人可以编辑问题以解决格式问题?
    *
    存在,但不在后引号之间。此指针(或变量)
    N
    是否为该类的成员?当您指该类的全局时,您指的是
    static
    ?@mcnemesis I,其编辑会改变语义,尤其是当问题由新用户发布时。H
    #include "members.h"
    
    double a; // Definition of global a
    
    double * B::d;  // Definition for static member d
    
    B b1;     // Static instance of class B
    
    int main() {
      B b2;      // Local instance of class B
      b1.f();    // Calling member function f() on b1
      b2.f();    // Calling member function f() on b2
      B::g();    // Calling static member function g()
    }