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