Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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++_Delete Operator - Fatal编程技术网

C++ 指针与引用,并将其清理干净

C++ 指针与引用,并将其清理干净,c++,delete-operator,C++,Delete Operator,考虑以下代码: #include <iostream> using namespace std; struct SOME_OTHER_BASE { // members }; struct FOO : SOME_OTHER_BASE { int value; static FOO *CreatePtr(int param) { FOO *res = new FOO(); res->value = para

考虑以下代码:

#include <iostream>
using namespace std;

struct SOME_OTHER_BASE {
    // members
};

struct FOO : SOME_OTHER_BASE {
    int value;
    static FOO *CreatePtr(int param) 
    { 
        FOO *res = new FOO(); 
        res->value = param; 
        return res;
    }
    static FOO &CreateRef(int param)
    {
        return *CreatePtr(param);
    }
};

int main() {
    FOO *ptr = FOO::CreatePtr(2);
    FOO &ref = FOO::CreateRef(4);
    FOO local = FOO::CreateRef(5);

    cout << "ptr: " << ptr->value << endl;
    cout << "ref: " << ref.value << endl;
    cout << "local: " << local.value << endl;

    delete ptr;
    delete &ref;
    return 0;
#包括
使用名称空间std;
构建一些其他的基础{
//成员
};
struct FOO:SOME\u OTHER\u BASE{
int值;
静态FOO*CreatePtr(int参数)
{ 
FOO*res=新的FOO();
res->value=param;
返回res;
}
静态FOO和CreateRef(int参数)
{
返回*CreatePtr(参数);
}
};
int main(){
FOO*ptr=FOO::CreatePtr(2);
FOO&ref=FOO::CreateRef(4);
FOO local=FOO::CreateRef(5);

无法确定您的案例是否应该使用指针。
此外,您没有删除创建到
local
变量的指针

由于
FOO
应该是一个POD,并且取决于它的大小(这取决于
SOME\u OTHER\u BASE
的大小),您可以通过创建方法中的值返回它:

struct FOO : SOME_OTHER_BASE {
    int value;
    static FOO Create(int param) {
        FOO foo;
        foo.value = param;
        return foo;
    }
};

int main() {
    FOO local = FOO::Create(2);
    FOO &ref = local;
    FOO *ptr = new FOO(FOO::Create(6));
    // can check if ptr is NULL if you want

    cout << "local: " << local.value << endl;
    cout << "ref: " << ref.value << endl;
    cout << "ptr: " << ptr->value << endl;

    delete ptr;
    return 0;
}
struct FOO:SOME\u OTHER\u BASE{
int值;
静态FOO创建(int参数){
富富,;
foo.value=param;
返回foo;
}
};
int main(){
FOO local=FOO::Create(2);
FOO&ref=本地;
FOO*ptr=newfoo(FOO::Create(6));
//如果需要,可以检查ptr是否为空

无法如果无法创建对象,则抛出异常。无论如何,它更有用,因为它提供了无法创建对象的更多上下文,并允许程序修复问题。此外,您还可以避免
删除
的问题,因为您不使用
新建
。如果要以多态方式使用该类型,则需要使用sm艺术指针,如
std::unique\u ptr
std::shared\u ptr

#include <iostream>
#include <stdexcept>
using namespace std;

struct SOME_OTHER_BASE {
    // members
};

struct CreationFailure : std::runtime_error
{
    CreationFailure(const std::string& s) :
        std::runtime_error(s)
    {

    }
};

struct FOO : SOME_OTHER_BASE {
    int value;

    FOO(int value) : 
        SOME_OTHER_BASE(), // pass the constructor arguments
        value(value)
    {
        // additional actions
        if(/* creation failed */)
            throw CreationFailure("out of memory");
    }
};

int main() {
    FOO local(2);

    cout << local.value << endl;
    return 0;
}

“我想要的是:尽可能少的删除调用(和内存泄漏)。”很简单,一开始就不要调用
new
。没有更多的上下文来理解为什么,我想知道为什么不使用智能指针,我的眼睛会因为看代码而受伤。大写标识符。为什么?@zenith虽然没有强制要求为常量和#定义保留所有的大写字母,但阅读这些大写字母的代码很容易混淆这是一种常见的现象guideline@zenith-因为除了宏名,没有人会这么做。我不想让任何源代码对我大喊大叫。努夫说。有一个要求,FOO是一个POD。如果我能有构造函数,这不会是一个问题。@velis哦,我错过了这个要求。但我认为同样的逻辑可以在你的工厂函数中实现。我会在一分钟内更新它。你是对的,不知怎么的,我忘记了我可以返回整个对象:(这是赋值时的完整副本,尽管它没有引入局部变量的泄漏。此外,我刚刚意识到我过于简化了我的示例:(我使用分配,因为我的POD大小不同(最后包含一个字符[])我想如果我玩动态分配,我无法告诉编译器我的类有多大。你在C++中使用了灵活的数组成员?这只是在C中定义的,所以你现在使用的是语言扩展。
FOO createFoo(int v)
{
    FOO f;
    f.value = v;
    if(/* creation failed */)
        throw CreationFailure("out of memory");
    return f;
}