Don't call the destructor manually. It is already called for you automatically. As a result, it now gets called twice, which is Bad(TM).
By the way, your code ignores the 'Script' member of the class and instead loads the data into memory allocated locally within LoadScript(), which is then never deallocated.
Oh, and the call to free() should pass 'Script' directly, rather than its address.
Oh, and you would need to deallocate the individual char* allocations as well as the containing char**.
Might I make a suggestion? If you want to use C++, use C++. Its standard library provides a variety of tools that make all of this much, much easier and more straightforward.
In modern C++, your program looks more like this:
#include <string>#include <vector>#include <iostream>#include <fstream>using namespace std;class Script{ public: // Instead of making parameters to say whether other parameters // are valid (which makes things quite complicated for the // calling code), use function overloads. Also, use constructors // to construct objects, i.e. to set their initial state. Script(const std::string& filename); Script(const std::string& filename, int count); private: std::vector<std::string> lines;};Script::Script(const std::string& filename){ ifstream stream(filename.c_str()); // voila, it's open. string line; while (std::getline(stream, line)) { lines.push_back(line); } // voila, done. No memory allocation work. No length limits on // either the file or on individual lines. No wasting the space for // an entire buffer for a blank line. cout << "ScriptSystem: >>Loaded script\n";}// There are ways to make the two constructors reuse a common body and avoid// redundancy, but I'm trying to keep this example as easy to understand as // possible.Script::Script(const std::string& filename, int count){ ifstream stream(filename.c_str()); string line; for (int i = 0; i < count; ++i) { if (std::getline(stream, line)) { lines.push_back(line); } else { break; } // the file ran out of lines earlier than expected. } cout << "ScriptSystem: >>Loaded script\n";}int main(int argCount, char** argValue) { // Don't make things global when you don't have to. Script s(argValue[1]); // yes, it will get converted to std::string automatically. // Boom, we're done.}