现代C+中的自动生命周期管理+;不';I don’我没有按预期工作 我试图证明,当超出范围时,现代C++会自动删除对象。我使用下面的代码来执行测试。但它并没有像预期的那样起作用。根据任务管理器中显示的内存大小,它仍然有200+MB的内存。但是一旦我取消注释删除stringTest,内存就会减少到1 MB以下。谁能帮我看看我忽略了什么?非常感谢

现代C+中的自动生命周期管理+;不';I don’我没有按预期工作 我试图证明,当超出范围时,现代C++会自动删除对象。我使用下面的代码来执行测试。但它并没有像预期的那样起作用。根据任务管理器中显示的内存大小,它仍然有200+MB的内存。但是一旦我取消注释删除stringTest,内存就会减少到1 MB以下。谁能帮我看看我忽略了什么?非常感谢,c++,C++,顺便说一句,我的测试中使用了Visual Studio 2015 #include "stdafx.h" #include <iostream> class StringTest { public: std::string StringSample; StringTest::StringTest() { StringSample = "abcdefghijklmnopqrstuvwxyz..."; } std::strin

顺便说一句,我的测试中使用了Visual Studio 2015

#include "stdafx.h"
#include <iostream>

class StringTest
{
public:
    std::string StringSample;

    StringTest::StringTest()
    {
        StringSample = "abcdefghijklmnopqrstuvwxyz...";
    }

    std::string StringTest::Substring(int length)
    {
        std::string result = StringSample.substr(0, length);

        return result;
    }
};

void testStringSeveralTimes()
{
    for (auto i = 0; i < 100000; i++)
    {
        auto stringTest = new StringTest();
        // delete stringTest;
    }
}

int main()
{
    testStringSeveralTimes();

    std::cout << "Done." << std::endl;
    int a;
    std::cin >> a;

    return 0;
}
#包括“stdafx.h”
#包括
类字符串测试
{
公众:
std::字符串样本;
StringTest::StringTest()
{
StringSample=“abcdefghijklmnopqrstuvxyz…”;
}
std::string StringTest::Substring(int-length)
{
std::string result=StringSample.substr(0,长度);
返回结果;
}
};
void teststringsevertimes()
{
用于(自动i=0;i<100000;i++)
{
自动stringTest=新stringTest();
//删除stringTest;
}
}
int main()
{
TestStringSevertimes();
std::cout a;
返回0;
}

我想在你学习基础知识之前,我不会使用“现代C++”这个词。在C++11之前,
auto
是一个表示自动存储持续时间的存储类说明符,它属于指针变量,而不是它所管理的内存。在C++11中,
auto
被重新调整用途,以允许在变量声明中执行模板参数推断<代码>stringTest被推断为
stringTest*

您正在寻找的概念是RAII,一点也不新。您应该使用一个智能指针,它将为您管理内存,并在内存超出预期范围时释放内存

auto stringTest = std::make_unique<StringTest>();
auto-stringTest=std::make_unique();

auto不会按您的想法操作。查找
std::unique_ptr
std::shared_ptr
std:make_unique()
auto表示将“自动”选择该类型,它未链接到内存管理:感谢回复。我尝试使用<代码> StRestTyx*/Cudio>,但结果是一样的。结果是相同的。清理C++给了你(对于C++的每个标准来说都是一样的),<代码> StRestTest< /C>本身在超出范围时被清理。清理它指向的对象将无法通过动态分配来延长该对象的寿命。我的印象是,一旦对象超出范围,C++11或C++14将自动释放内存。事实证明,只有当我们使用智能指针时,这才是真的。非常感谢。或者干脆
StringTest-StringTest因为这里没有一个动态分配对象的需要。@ Shinbo:C++确实是这样做的(总是有,在C++ 11之前很久)。但在您的例子中,超出范围的对象是指针。
StringTest
对象是动态分配的,没有作用域。如果您只是正常地创建了一个
StringTest
对象(如我之前的评论所示),那么当它超出范围时,它也会被销毁,并且其内存会被回收。@Benjamin Lindley:所以对于动态分配的内存,我们应该始终使用“现代C++”中引入的智能指针,以缓解解除分配。是吗?@Shinbo写下单词
new
表示您想使用手动内存管理,这意味着您必须
删除
。要使用自动内存管理,请不要编写
new