C/C++ Code Smells

Common code smells in C/C++ and how to fix them.


Memory Leaks

 1// ❌ Bad
 2void process() {
 3    int* data = new int[100];
 4    // ... use data ...
 5    // forgot to delete!
 6}
 7
 8// βœ… Good: Use RAII
 9void process() {
10    std::vector<int> data(100);
11    // ... use data ...
12    // automatically cleaned up
13}
14
15// βœ… Good: Smart pointers
16void process() {
17    auto data = std::make_unique<int[]>(100);
18    // ... use data ...
19    // automatically cleaned up
20}

Buffer Overflow

 1// ❌ Bad
 2char buffer[10];
 3strcpy(buffer, user_input);  // Dangerous!
 4
 5// βœ… Good
 6char buffer[10];
 7strncpy(buffer, user_input, sizeof(buffer) - 1);
 8buffer[sizeof(buffer) - 1] = '\0';
 9
10// βœ… Better (C++)
11std::string buffer = user_input;

Use After Free

1// ❌ Bad
2int* ptr = new int(42);
3delete ptr;
4*ptr = 10;  // Use after free!
5
6// βœ… Good
7auto ptr = std::make_unique<int>(42);
8// Can't use after it's freed

Raw Pointers

1// ❌ Bad
2Widget* createWidget() {
3    return new Widget();
4}
5
6// βœ… Good
7std::unique_ptr<Widget> createWidget() {
8    return std::make_unique<Widget>();
9}

Not Using const

 1// ❌ Bad
 2void process(std::vector<int>& data) {
 3    for (int i = 0; i < data.size(); i++) {
 4        std::cout << data[i];
 5    }
 6}
 7
 8// βœ… Good
 9void process(const std::vector<int>& data) {
10    for (const auto& item : data) {
11        std::cout << item;
12    }
13}

Related Snippets