Skip to content

Instantly share code, notes, and snippets.

@neil-s
Last active December 17, 2015 19:19
Show Gist options
  • Save neil-s/5659737 to your computer and use it in GitHub Desktop.
Save neil-s/5659737 to your computer and use it in GitHub Desktop.
Basic stack implementation. Segfaults.
#include <iostream>
#include "hello.hh"
template<class T> void Stack<T>::append(T val) {
Item **pp = &head;
while(*pp) {pp = &((*pp)->next);}
*pp = new Item(val);
}
template<class T> void Stack<T>::push(T val) {
Item *item = new Item(val);
if(head) {item->next = head;}
head = item;
}
template<class T> T Stack<T>::pop() {
if(!head) {
std::cout << "Empty" << std::endl;
return NULL;
}
Item *item = head;
T val = item->val;
head = item->next;
std::cout << "Popped: " << val << std::endl;
delete item;
return val;
}
template<class T> Stack<T>::~Stack() {
while(head){
pop();
}
}
template<class T> void Stack<T>::test(void) {
while(head){
pop();
}
}
int main() {
Stack<char> s;
s.push('a'), s.append('b');
// char ans1 = (s.pop(), s.pop());
// char ans2 = s.pop();
// s.test();
// delete &s;
// char res;
// std::cin >> res;
return 0;
}
template<class T> class Stack {
struct Item { //class with all public members
T val;
Item* next;
Item(T v) : val(v), next(0) {}
};
Item* head;
Stack(const Stack& s) {} //private
Stack& operator=(const Stack& s) {} //
public:
Stack() : head(0) {}
~Stack(); // should generally be virtual
T pop();
void push(T val);
void append(T val);
void test(void);
};
macbook:Exam neil$ valgrind --tool=memcheck --leak-check=full --show-reachable=yes ./a.out | results.txt
-bash: results.txt: command not found
==24090== Memcheck, a memory error detector
==24090== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==24090== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==24090== Command: ./a.out
==24090==
==24090==
==24090== HEAP SUMMARY:
==24090== in use at exit: 18,499 bytes in 33 blocks
==24090== total heap usage: 35 allocs, 2 frees, 18,531 bytes allocated
==24090==
==24090== 8 bytes in 1 blocks are still reachable in loss record 1 of 9
==24090== at 0xC713: malloc (vg_replace_malloc.c:274)
==24090== by 0x7FFF5FC11C2A: malloc (in /usr/lib/dyld)
==24090== by 0x7FFF5FC19C4E: operator new(unsigned long) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0817E: std::vector<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), std::allocator<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*)> >::_M_insert_aux(__gnu_cxx::__normal_iterator<char const* (**)(dyld_image_states, unsigned int, dyld_image_info const*), std::vector<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), std::allocator<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*)> > >, char const* (* const&)(dyld_image_states, unsigned int, dyld_image_info const*)) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC08260: std::vector<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), std::allocator<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*)> >::insert(__gnu_cxx::__normal_iterator<char const* (**)(dyld_image_states, unsigned int, dyld_image_info const*), std::vector<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), std::allocator<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*)> > >, char const* (* const&)(dyld_image_states, unsigned int, dyld_image_info const*)) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC054FA: dyld::registerImageStateBatchChangeHandler(dyld_image_states, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*)) (in /usr/lib/dyld)
==24090== by 0x1D5ACB: dyld_register_image_state_change_handler (in /usr/lib/system/libdyld.dylib)
==24090== by 0x1D6ACB: _dyld_initializer (in /usr/lib/system/libdyld.dylib)
==24090== by 0xECE73: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==24090== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==24090==
==24090== 87 bytes in 7 blocks are still reachable in loss record 2 of 9
==24090== at 0xC713: malloc (vg_replace_malloc.c:274)
==24090== by 0x256358: strdup (in /usr/lib/system/libsystem_c.dylib)
==24090== by 0x3FC802: _xpc_strdup (in /usr/lib/system/libxpc.dylib)
==24090== by 0x402CCF: _xpc_dictionary_insert (in /usr/lib/system/libxpc.dylib)
==24090== by 0x402E0E: xpc_dictionary_set_string (in /usr/lib/system/libxpc.dylib)
==24090== by 0x404E8C: _libxpc_initializer (in /usr/lib/system/libxpc.dylib)
==24090== by 0xECE7D: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==24090== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==24090==
==24090== 88 bytes in 1 blocks are still reachable in loss record 3 of 9
==24090== at 0xC713: malloc (vg_replace_malloc.c:274)
==24090== by 0x1DE9B0: get_or_create_key_element (in /usr/lib/system/libkeymgr.dylib)
==24090== by 0x1DEBC9: _keymgr_get_and_lock_processwide_ptr_2 (in /usr/lib/system/libkeymgr.dylib)
==24090== by 0x1DEC36: __keymgr_initializer (in /usr/lib/system/libkeymgr.dylib)
==24090== by 0xECE6E: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==24090== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC034B7: dyld::initializeMainExecutable() (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0760A: dyld::_main(macho_header const*, unsigned long, int, char const**, char const**, char const**) (in /usr/lib/dyld)
==24090==
==24090== 136 bytes in 1 blocks are still reachable in loss record 4 of 9
==24090== at 0xD9C3: calloc (vg_replace_malloc.c:597)
==24090== by 0x3FC8FA: _xpc_calloc (in /usr/lib/system/libxpc.dylib)
==24090== by 0x3FD1D4: _xpc_base_create (in /usr/lib/system/libxpc.dylib)
==24090== by 0x406C32: _xpc_domain_create (in /usr/lib/system/libxpc.dylib)
==24090== by 0x404F1E: _libxpc_initializer (in /usr/lib/system/libxpc.dylib)
==24090== by 0xECE7D: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==24090== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC034B7: dyld::initializeMainExecutable() (in /usr/lib/dyld)
==24090==
==24090== 224 bytes in 7 blocks are still reachable in loss record 5 of 9
==24090== at 0xC713: malloc (vg_replace_malloc.c:274)
==24090== by 0x3FC93D: _xpc_malloc (in /usr/lib/system/libxpc.dylib)
==24090== by 0x402CB4: _xpc_dictionary_insert (in /usr/lib/system/libxpc.dylib)
==24090== by 0x402E0E: xpc_dictionary_set_string (in /usr/lib/system/libxpc.dylib)
==24090== by 0x404E8C: _libxpc_initializer (in /usr/lib/system/libxpc.dylib)
==24090== by 0xECE7D: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==24090== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC034B7: dyld::initializeMainExecutable() (in /usr/lib/dyld)
==24090==
==24090== 348 bytes in 7 blocks are still reachable in loss record 6 of 9
==24090== at 0xC713: malloc (vg_replace_malloc.c:274)
==24090== by 0x256358: strdup (in /usr/lib/system/libsystem_c.dylib)
==24090== by 0x3FC802: _xpc_strdup (in /usr/lib/system/libxpc.dylib)
==24090== by 0x403BF5: xpc_string_create (in /usr/lib/system/libxpc.dylib)
==24090== by 0x402DFD: xpc_dictionary_set_string (in /usr/lib/system/libxpc.dylib)
==24090== by 0x404E8C: _libxpc_initializer (in /usr/lib/system/libxpc.dylib)
==24090== by 0xECE7D: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==24090== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==24090==
==24090== 608 bytes in 1 blocks are still reachable in loss record 7 of 9
==24090== at 0xD9C3: calloc (vg_replace_malloc.c:597)
==24090== by 0x3FC8FA: _xpc_calloc (in /usr/lib/system/libxpc.dylib)
==24090== by 0x3FD1D4: _xpc_base_create (in /usr/lib/system/libxpc.dylib)
==24090== by 0x402FDA: xpc_dictionary_create (in /usr/lib/system/libxpc.dylib)
==24090== by 0x404E63: _libxpc_initializer (in /usr/lib/system/libxpc.dylib)
==24090== by 0xECE7D: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==24090== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC034B7: dyld::initializeMainExecutable() (in /usr/lib/dyld)
==24090==
==24090== 616 bytes in 7 blocks are still reachable in loss record 8 of 9
==24090== at 0xD9C3: calloc (vg_replace_malloc.c:597)
==24090== by 0x3FC8FA: _xpc_calloc (in /usr/lib/system/libxpc.dylib)
==24090== by 0x3FD1D4: _xpc_base_create (in /usr/lib/system/libxpc.dylib)
==24090== by 0x403BEA: xpc_string_create (in /usr/lib/system/libxpc.dylib)
==24090== by 0x402DFD: xpc_dictionary_set_string (in /usr/lib/system/libxpc.dylib)
==24090== by 0x404E8C: _libxpc_initializer (in /usr/lib/system/libxpc.dylib)
==24090== by 0xECE7D: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==24090== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==24090== by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==24090==
==24090== 16,384 bytes in 1 blocks are still reachable in loss record 9 of 9
==24090== at 0xC713: malloc (vg_replace_malloc.c:274)
==24090== by 0x2633F7: __smakebuf (in /usr/lib/system/libsystem_c.dylib)
==24090== by 0x259D19: __swsetup (in /usr/lib/system/libsystem_c.dylib)
==24090== by 0x28FD2D: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==24090== by 0x28FCA4: fwrite (in /usr/lib/system/libsystem_c.dylib)
==24090== by 0x42710: std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long) (in /usr/lib/libstdc++.6.0.9.dylib)
==24090== by 0x427E9: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib/libstdc++.6.0.9.dylib)
==24090== by 0x100000B99: Stack<char>::pop() (hello.cpp:23)
==24090== by 0x100000BFF: Stack<char>::~Stack() (hello.cpp:29)
==24090== by 0x1000008A0: main (hello.cpp:50)
==24090==
==24090== LEAK SUMMARY:
==24090== definitely lost: 0 bytes in 0 blocks
==24090== indirectly lost: 0 bytes in 0 blocks
==24090== possibly lost: 0 bytes in 0 blocks
==24090== still reachable: 18,499 bytes in 33 blocks
==24090== suppressed: 0 bytes in 0 blocks
==24090==
==24090== For counts of detected and suppressed errors, rerun with: -v
==24090== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
@Fedjmike
Copy link

template<class T> void Stack<T>::append(T val) {
    if (head) {
        Item* cur = head;

        while (cur->next)
            cur = cur->next;

        cur->next = new Item(val);

    } else
        head = new Item(val);
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment