C++ 如何使用指针和引用c++;瓦尔格林呢?

C++ 如何使用指针和引用c++;瓦尔格林呢?,c++,pointers,reference,valgrind,C++,Pointers,Reference,Valgrind,我有以下代码: [test.h] class MyClass { public: string Name; MyClass(); void method(MyClass &obj); } [test.cpp] void MyClass::method(MyClass &obj) { cout<<obj.Name<<endl; } [main.cpp] #include "test.h" void main() {

我有以下代码:

[test.h]
class MyClass
{
public:
    string Name;
    MyClass();
    void method(MyClass &obj);
}

[test.cpp]
void MyClass::method(MyClass &obj)
{
    cout<<obj.Name<<endl;
}

[main.cpp]
#include "test.h"

void main()
{
    MyClass *class = new MyClass();
    class->Name="Foo";
    class->method(*class);

    delete class;
}
[test.h]
类MyClass
{
公众:
字符串名;
MyClass();
无效方法(MyClass和obj);
}
[test.cpp]
void MyClass::方法(MyClass&obj)
{

coutcompile=>valgrindg++./main 并查看是否存在内存泄漏

确保您已经安装了valgrind,否则您应该通过apt get或ubuntu软件中心安装它


希望这有帮助。

编译=>valgrind g++./main 并查看是否存在内存泄漏

确保您已经安装了valgrind,否则您应该通过apt get或ubuntu软件中心安装它


希望这有帮助。

我觉得很奇怪,编译器没有大声说
class
是保留关键字

无论如何,在我看来,使用
方法(MyClass&obj)
不是一个好主意,因为你已经有了一个指针,它是去引用,然后又被引用了。我只是不知道它指向什么,这可能就是警告出现的原因

请尝试以下操作,看看是否仍有相同的警告,我现在无法测试:

test.h
class MyClass
{
public:
   string Name;
    MyClass();
    void method(MyClass* obj);
}

test.cpp
void MyClass::method(MyClass* obj)
{
    cout<<obj->Name<<endl;
}

main.cpp
#include "test.h"

void main()
{
    MyClass *class = new MyClass();
    class->Name="Foo";
    class->method(class);

    delete class;
}
test.h
类MyClass
{
公众:
字符串名;
MyClass();
无效方法(MyClass*obj);
}
test.cpp
void MyClass::方法(MyClass*obj)
{

难道我觉得奇怪,编译器没有大声说
class
是保留关键字

无论如何,在我看来,使用
方法(MyClass&obj)
不是一个好主意,因为你已经有了一个指针,它是去引用,然后又被引用了。我只是不知道它指向什么,这可能就是警告出现的原因

请尝试以下操作,看看是否仍有相同的警告,我现在无法测试:

test.h
class MyClass
{
public:
   string Name;
    MyClass();
    void method(MyClass* obj);
}

test.cpp
void MyClass::method(MyClass* obj)
{
    cout<<obj->Name<<endl;
}

main.cpp
#include "test.h"

void main()
{
    MyClass *class = new MyClass();
    class->Name="Foo";
    class->method(class);

    delete class;
}
test.h
类MyClass
{
公众:
字符串名;
MyClass();
无效方法(MyClass*obj);
}
test.cpp
void MyClass::方法(MyClass*obj)
{

CUT

<代码>类< /C>是C++中的保留字,不能用它作为变量的名称。< /P> 此外,除非您明确要求,否则无需动态分配对象。如果可能,只需自动分配:

MyClass x;
x.Name = "Foo";
x.method(x);

<> >代码>类<代码>是C++中的保留字,不能用它作为变量的名称。< /P> 此外,除非您明确要求,否则无需动态分配对象。如果可能,只需自动分配:

MyClass x;
x.Name = "Foo";
x.method(x);

这是正确的。唯一会把事情搞砸的方法是忘记删除、多次删除,或者新建和删除之间不匹配(带括号或不带括号)。但是有几件事需要注意:

在exmpmle中,可以将参数作为常量ref传递,因为您不会更改它

void method(const MyClass &obj) const;
在cpp中也相应地:

void MyClass::method(const MyClass &obj) const{ ... }
您根本不需要使用new在堆上分配对象。事实上,您几乎可以像这样使用sytax:

void main()
{
    MyClass obj; // <- allocates it on the stack
    obj.Name="Foo";
    obj.method(obj);
}
// class is properly deleted when it goes out of scope
void main()
{

MyClass obj;//这是正确的。唯一会把事情搞砸的方法是忘记删除、多次删除,或者新建和删除之间不匹配(带括号或不带括号)。但是有几件事需要注意:

在exmpmle中,可以将参数作为常量ref传递,因为您不会更改它

void method(const MyClass &obj) const;
在cpp中也相应地:

void MyClass::method(const MyClass &obj) const{ ... }
您根本不需要使用new在堆上分配对象。事实上,您几乎可以像这样使用sytax:

void main()
{
    MyClass obj; // <- allocates it on the stack
    obj.Name="Foo";
    obj.method(obj);
}
// class is properly deleted when it goes out of scope
void main()
{

MyClass obj;//看起来没有内存泄漏和未初始化值的使用。
Name
成员将由其默认构造函数初始化。Valgrind报告的错误可能来自标准库或您可能使用的其他库。还要注意,此错误并不总是表示代码中的错误。

看起来像这样没有内存泄漏和未初始化值的使用。
Name
成员将由其默认构造函数初始化。Valgrind报告的错误可能来自标准库或您可能使用的其他库。还要注意,此错误并不总是表示代码中的错误

为什么不能将int VALUE=0;放入test.h文件中

如果
VALUE
是类变量的一部分,则不允许将其作为类声明的一部分进行初始化。相反,应使用构造函数初始值设定项列表

// Constructor

MyClass :: MyClass() : VALUE(0) 
                  // ^^^^^^^^^^^ Initializer list
{ }
然而,如果将
VALUE
定义为全局变量,则这也会导致问题。当在多个源文件中包含
test.h
时,会导致多个声明错误。请在源文件中定义它,并使用extern关键字跨多个翻译单元访问

为什么不能将int VALUE=0;放入test.h文件中

如果
VALUE
是类变量的一部分,则不允许将其作为类声明的一部分进行初始化。相反,应使用构造函数初始值设定项列表

// Constructor

MyClass :: MyClass() : VALUE(0) 
                  // ^^^^^^^^^^^ Initializer list
{ }

然而,如果将
VALUE
定义为全局变量,那么这也会导致问题。当您在多个源文件中包含
test.h
时,会导致多个声明错误。请在源文件中定义它,并使用extern关键字跨多个翻译单元访问。

对我来说似乎没问题,但您需要ould初始化类的成员此外,如果您使用-g标志编译,valgrind将告诉您它认为存在错误的行号:)@Eran:不需要显式初始化
Name
。默认的
std::string
构造函数被隐式调用。但是
MyClass
构造函数定义在这里丢失。看起来我同意,但您应该初始化类的成员此外,如果您使用-g标志编译,valgrind将告诉您它认为存在错误的行号:)@Eran:无需显式初始化
Name
。默认的
std::string
构造函数被隐式调用。但是
MyClass