C++ 共享的ptr泄漏测试代码的weired结果

C++ 共享的ptr泄漏测试代码的weired结果,c++,memory-leaks,shared-ptr,smart-pointers,C++,Memory Leaks,Shared Ptr,Smart Pointers,我期望test1.cpp和test2.cpp产生类似的结果。 每次运行时打印相同,因为没有内存泄漏。 但事实并非如此。我不知道为什么。 你能告诉我了解这种情况有什么意义吗 test1.cpp #include <iostream> #include <memory> using namespace std; class Class { public: shared_ptr<int> value1; shared_ptr<int>

我期望test1.cpp和test2.cpp产生类似的结果。
每次运行时打印相同,因为没有内存泄漏。
但事实并非如此。我不知道为什么。
你能告诉我了解这种情况有什么意义吗

test1.cpp

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

class Class {
public:
    shared_ptr<int> value1;
    shared_ptr<int> value2;
    Class() {};
};

int main() {
    char pause;
    while (true) {
        shared_ptr<Class>cls(new Class());
        cout << cls.get() << endl;
        cin >> pause;
    }
    return 0;
}
test2.cpp

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

class Class {
public:
    int value1;
    int value2;
    Class() {};
};

int main() {
    char pause;
    while (true) {
        shared_ptr<Class>cls(new Class());
        cout << cls.get() << endl;
        cin >> pause;
    }
    return 0;
}
test3.cpp-这是最奇怪的结果

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

class Class {
public:
    shared_ptr<int> value1;
    shared_ptr<int> value2;
    shared_ptr<int> value3;
    Class() {};
};

int main() {
    char pause;
    while (true) {
        shared_ptr<Class>cls(new Class());
        cout << cls.get() << endl;
        cin >> pause;
    }
    return 0;
}

在每个循环中,创建一个新的局部变量shared_ptrcls,并动态地分配对象的内存。当一个循环结束时,旧对象被自动删除,然后新循环将创建一个新对象,它不必与上一个循环中的旧对象具有相同的地址,因为它是全新的。这两种结果都是正常的,两种情况都可能发生

您正在打印的是类(坏名称)对象的地址

在第二种情况下,当共享的\u ptr超出范围并且在同一内存位置分配了一个新对象时,您的类对象将被释放。没关系

在第一种情况下,出于某种原因,为新类对象选择了不同的地址。从经验上看,这一定与其他分配和交易有关。如果不查看分配器的内部逻辑,您将不会得到比这更精确的答案


而且,在任何情况下,您绝对不应该依赖于遵循任何类型逻辑的地址。你根本不应该在意。

问题解决了。我所期望的是在while循环结束时删除每个本地对象(在本例中,在测试函数结束时删除test4.cpp)。但事实并非如此

test4.cpp

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

class Class {
public:
    shared_ptr<int> value1;
    shared_ptr<int> value2;
    Class() {};
};

char test() {
  char pause;
  shared_ptr<Class>cls(new Class());
  cout << cls.get() << endl;
  cin >> pause;
  return pause;
}

int main() {
    while (true) {
      if ('q' == test()) break;
    }
    return 0;
}
#包括
#包括
使用名称空间std;
班级{
公众:
共享ptr值1;
共享ptr值2;
类(){};
};
字符测试(){
字符暂停;
共享(新类());
不能停顿;
返回暂停;
}
int main(){
while(true){
如果('q'==test())中断;
}
返回0;
}
测试结果

root@real:~# ltrace -C ./test
__libc_start_main(0x8048d2f, 1, 0xffffd4c4, 0x8048fc0 <unfinished ...>
std::ios_base::Init::Init()(0x804b1d9, 0x4a00, 0xf7c81dc8, 0xf7ffb000) = 0xf7fbde14
__cxa_atexit(0x8048920, 0x804b1d9, 0x804b05c, 0xf7ffb000)    = 0
operator new(unsigned int)(16, 0xffffd4c4, 0xf7fb608c, 0x8048d69) = 0x8050a10
operator new(unsigned int)(16, 0xffffd4c4, 0xf7fb608c, 0x8048d69) = 0x8050a28
std::ostream& std::ostream::_M_insert<void const*>(void const*)(0x804b120, 0x8050a10, 0xf7fb608c, 0x8048d69) = 0x804b120
std::ostream::put(char)(0x804b120, 10, 0xf7fb608c, 0x8048d690x8050a10
) = 0x804b120
std::ostream::flush()(0x804b120, 10, 0xf7fb608c, 0x8048d69)  = 0x804b120
std::basic_istream<char, std::char_traits<char> >& std::operator>><char, std::char_traits<char> >(std::basic_istream<char, std::char_traits<char> >&, char&)(0x804b060, 0xffffd3f3, 0xf7fb608c, 0x8048d691
) = 0x804b060
operator delete(void*, unsigned int)(0x8050a10, 16, 0xf7f26f0b, 0xf7fbd660) = 0
operator delete(void*, unsigned int)(0x8050a28, 16, 0xf7f26f0b, 0xf7fbd660) = 0x8050a08
operator new(unsigned int)(16, 0xffffd3f3, 0xf7fb608c, 0x8048d69) = 0x8050a28
operator new(unsigned int)(16, 0xffffd3f3, 0xf7fb608c, 0x8048d69) = 0x8050a10
std::ostream& std::ostream::_M_insert<void const*>(void const*)(0x804b120, 0x8050a28, 0xf7fb608c, 0x8048d69) = 0x804b120
std::ostream::put(char)(0x804b120, 10, 0xf7fb608c, 0x8048d690x8050a28
) = 0x804b120
std::ostream::flush()(0x804b120, 10, 0xf7fb608c, 0x8048d69)  = 0x804b120
std::basic_istream<char, std::char_traits<char> >& std::operator>><char, std::char_traits<char> >(std::basic_istream<char, std::char_traits<char> >&, char&)(0x804b060, 0xffffd3f3, 0xf7fb608c, 0x8048d69q
) = 0x804b060
operator delete(void*, unsigned int)(0x8050a28, 16, 0xf7f26f0b, 0xf7fbd660) = 0
operator delete(void*, unsigned int)(0x8050a10, 16, 0xf7f26f0b, 0xf7fbd660) = 0x8050a20
std::ios_base::Init::~Init()(0x804b1d9, 0, 0, 0xf7ca38d7)    = 0xf7fbc5c0
+++ exited (status 0) +++
root@real:~#ltrace-C./test
__libc_start_main(0x8048d2f,1,0xffffd4c4,0x8048fc0
std::ios_base::Init::Init()(0x804b1d9、0x4a00、0xf7c81dc8、0xf7ffb000)=0xf7fbde14
__cxa_atexit(0x8048920、0x804b1d9、0x804b05c、0xf7ffb000)=0
新运算符(无符号整数)(16,0xffffd4c4,0xf7fb608c,0x8048d69)=0x8050a10
新运算符(无符号整数)(16,0xffffd4c4,0xf7fb608c,0x8048d69)=0x8050a28
std::ostream和std::ostream::_M_插入(无效常量*)(0x804b120、0x8050a10、0xf7fb608c、0x8048d69)=0x804b120
std::ostream::put(char)(0x804b120,10,0xf7fb608c,0x8048D690x805A10
)=0x804b120
std::ostream::flush()(0x804b120,10,0xf7fb608c,0x8048d69)=0x804b120
std::basic_istream&std::operator>>(std::basic_istream&,char&)(0x804b060,0xffffd3f3,0xf7fb608c,0x8048d691
)=0x804b060
运算符删除(void*,unsigned int)(0x8050a10,16,0xf7f26f0b,0xf7fbd660)=0
运算符删除(void*,unsigned int)(0x8050a28,16,0xf7f26f0b,0xf7fbd660)=0x8050a08
新运算符(无符号整数)(16,0xffffd3f3,0xf7fb608c,0x8048d69)=0x8050a28
新运算符(无符号整数)(16,0xffffd3f3,0xf7fb608c,0x8048d69)=0x8050a10
std::ostream和std::ostream::_M_插入(无效常量*)(0x804b120、0x8050a28、0xf7fb608c、0x8048d69)=0x804b120
std::ostream::put(char)(0x804b120,10,0xf7fb608c,0x8048D690X805A28
)=0x804b120
std::ostream::flush()(0x804b120,10,0xf7fb608c,0x8048d69)=0x804b120
std::basic_istream&std::operator>>(std::basic_istream&,char&)(0x804b060,0xffffd3f3,0xf7fb608c,0x8048d69q
)=0x804b060
运算符删除(void*,unsigned int)(0x8050a28,16,0xf7f26f0b,0xf7fbd660)=0
运算符删除(void*,unsigned int)(0x8050a10,16,0xf7f26f0b,0xf7fbd660)=0x8050a20
std::ios_base::Init::~Init()(0x804b1d9,0,0,0xf7ca38d7)=0xf7fbc5c0
+++已退出(状态0)+++

两者都是有效的行为。你能解释一下你期望的是什么以及为什么你认为另一个不好吗?这是我期望的。很抱歉链接。stackoverflow系统很糟糕。你可以/应该编辑你的问题并把你的理由放在那里。stackoverflow不是一个论坛。@drescherjm,我明白了。谢谢
0x826ba10
1
0x826ba10
1
0x826ba10
1
0x826ba10
1
0x826ba10
#include <iostream>
#include <memory>
using namespace std;

class Class {
public:
    shared_ptr<int> value1;
    shared_ptr<int> value2;
    Class() {};
};

char test() {
  char pause;
  shared_ptr<Class>cls(new Class());
  cout << cls.get() << endl;
  cin >> pause;
  return pause;
}

int main() {
    while (true) {
      if ('q' == test()) break;
    }
    return 0;
}
root@real:~# ltrace -C ./test
__libc_start_main(0x8048d2f, 1, 0xffffd4c4, 0x8048fc0 <unfinished ...>
std::ios_base::Init::Init()(0x804b1d9, 0x4a00, 0xf7c81dc8, 0xf7ffb000) = 0xf7fbde14
__cxa_atexit(0x8048920, 0x804b1d9, 0x804b05c, 0xf7ffb000)    = 0
operator new(unsigned int)(16, 0xffffd4c4, 0xf7fb608c, 0x8048d69) = 0x8050a10
operator new(unsigned int)(16, 0xffffd4c4, 0xf7fb608c, 0x8048d69) = 0x8050a28
std::ostream& std::ostream::_M_insert<void const*>(void const*)(0x804b120, 0x8050a10, 0xf7fb608c, 0x8048d69) = 0x804b120
std::ostream::put(char)(0x804b120, 10, 0xf7fb608c, 0x8048d690x8050a10
) = 0x804b120
std::ostream::flush()(0x804b120, 10, 0xf7fb608c, 0x8048d69)  = 0x804b120
std::basic_istream<char, std::char_traits<char> >& std::operator>><char, std::char_traits<char> >(std::basic_istream<char, std::char_traits<char> >&, char&)(0x804b060, 0xffffd3f3, 0xf7fb608c, 0x8048d691
) = 0x804b060
operator delete(void*, unsigned int)(0x8050a10, 16, 0xf7f26f0b, 0xf7fbd660) = 0
operator delete(void*, unsigned int)(0x8050a28, 16, 0xf7f26f0b, 0xf7fbd660) = 0x8050a08
operator new(unsigned int)(16, 0xffffd3f3, 0xf7fb608c, 0x8048d69) = 0x8050a28
operator new(unsigned int)(16, 0xffffd3f3, 0xf7fb608c, 0x8048d69) = 0x8050a10
std::ostream& std::ostream::_M_insert<void const*>(void const*)(0x804b120, 0x8050a28, 0xf7fb608c, 0x8048d69) = 0x804b120
std::ostream::put(char)(0x804b120, 10, 0xf7fb608c, 0x8048d690x8050a28
) = 0x804b120
std::ostream::flush()(0x804b120, 10, 0xf7fb608c, 0x8048d69)  = 0x804b120
std::basic_istream<char, std::char_traits<char> >& std::operator>><char, std::char_traits<char> >(std::basic_istream<char, std::char_traits<char> >&, char&)(0x804b060, 0xffffd3f3, 0xf7fb608c, 0x8048d69q
) = 0x804b060
operator delete(void*, unsigned int)(0x8050a28, 16, 0xf7f26f0b, 0xf7fbd660) = 0
operator delete(void*, unsigned int)(0x8050a10, 16, 0xf7f26f0b, 0xf7fbd660) = 0x8050a20
std::ios_base::Init::~Init()(0x804b1d9, 0, 0, 0xf7ca38d7)    = 0xf7fbc5c0
+++ exited (status 0) +++