C++ 指向对象表的指针
我想在所有垃圾邮件方法中使用对象的foo数组。 当我创建一个对象时,这个方法(当然有一个*)对我有效。 但即使我使用Bar**foo或Bar**foo[2],Xcode也向我显示我创建了指向对象的新指针C++ 指向对象表的指针,c++,class,oop,pointers,C++,Class,Oop,Pointers,我想在所有垃圾邮件方法中使用对象的foo数组。 当我创建一个对象时,这个方法(当然有一个*)对我有效。 但即使我使用Bar**foo或Bar**foo[2],Xcode也向我显示我创建了指向对象的新指针 [编辑]我注释了错误的代码示例,我的疏忽,谢谢各位 这里似乎有缓冲区溢出: Bar **foo = new Bar*[1]; // allocate one-element array of pointers to Bar foo[0] = new Foo(this); // v
[编辑]我注释了错误的代码示例,我的疏忽,谢谢各位 这里似乎有缓冲区溢出:
Bar **foo = new Bar*[1]; // allocate one-element array of pointers to Bar
foo[0] = new Foo(this); // valid assignment
foo[1] = new Foo(this); // off the end of the array.
这里似乎有缓冲区溢出:
Bar **foo = new Bar*[1]; // allocate one-element array of pointers to Bar
foo[0] = new Foo(this); // valid assignment
foo[1] = new Foo(this); // off the end of the array.
在您的
fun1
中,语句Bar**foo=newbar*[1]
定义一个新的局部变量foo
,该变量隐藏类成员名称
如果您想改为引用类成员,请说
foo=newbar*[1]代码>在您的fun1
中,语句Bar**foo=newbar*[1]
定义一个新的局部变量foo
,该变量隐藏类成员名称
如果您想改为引用类成员,请说foo=newbar*[1]
在方法Spam::fun1()中,您将内存分配给类型为“Bar**”的局部变量“foo”。相反,您必须为类成员变量“foo”分配内存。你可以做两件事来解决这个问题
删除局部变量声明“foo”,使用下面的代码,而不是“Bar**foo=new Bar*[1];“inside”Spam::fun1()
foo=新条*[1]
如果出于某些原因希望保留局部变量,请使用“this”指针指示类成员
此->foo=新条*[1]
只是一个建议,如果您在源代码中遵循如下正确的命名约定,您可以避免此类混淆
class CSpam: public CLayer
{
private:
Bar ** mFoo;
};
void Spam::fun1()
{
mFoo = new Bar*[1];
}
在方法Spam::fun1()中,您将内存分配给类型为“Bar**”的局部变量“foo”。相反,您必须为类成员变量“foo”分配内存。你可以做两件事来解决这个问题
删除局部变量声明“foo”,使用下面的代码,而不是“Bar**foo=new Bar*[1];“inside”Spam::fun1()
foo=新条*[1]
如果出于某些原因希望保留局部变量,请使用“this”指针指示类成员
此->foo=新条*[1]
只是一个建议,如果您在源代码中遵循如下正确的命名约定,您可以避免此类混淆
class CSpam: public CLayer
{
private:
Bar ** mFoo;
};
void Spam::fun1()
{
mFoo = new Bar*[1];
}
您没有以健康的方式使用“正确工作”。显然foo[1]
是一种越界访问。示例中任何包含foo[1]
且“正常工作”的语句似乎只起作用。它可能会在任何时候无故停止工作。这是因为foo只包含1个元素(因为“new Bar*[1]”),这意味着只有索引0是合法访问的(对于大小为N的数组,您可以访问索引0到N-1)。有关未定义行为的更多信息,请参阅。好吧,我同意,这是我的错。即使是foo[0],在Spam::fun1()中工作,也很糟糕。但我正在寻找正确的方法来指出这一点,并在Spam::fun2()中使用相同的对象,这是我的问题。您没有以健康的方式使用“正确工作”。显然foo[1]
是一种越界访问。示例中任何包含foo[1]
且“正常工作”的语句似乎只起作用。它可能会在任何时候无故停止工作。这是因为foo只包含1个元素(因为“new Bar*[1]”),这意味着只有索引0是合法访问的(对于大小为N的数组,您可以访问索引0到N-1)。请参阅更多关于未定义行为的信息。OKI,我同意,这是我的错,甚至是FoO(0),在垃圾邮件::FUN1()中,但是我寻找正确的方法来指向这个点,并在垃圾邮件中使用相同的对象::Fun2-(),这是我的问题。[谷歌C++风格指南] [C++ ]编程风格指南]〔3〕[ GCC C++编码约定]〔1〕〔1〕:[ 2 ]:[ 3 ]:[谷歌C++风格指南]〔2〕[ C++编程风格指南]〔3〕[ GCC C++编码约定]〔1〕〔1〕:[ 2 ]:[ 3 ]: